// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/widgets.dart';

// Test file used by `create_test.dart` to verify that `flutter create` sets up
// `analysis_options.yaml` correctly to activate certain lints and ensures
// that lints not playing well with Flutter remain disabled.

class NoConstructor extends StatelessWidget {
  // LINT: Missing constructor generates use_key_in_widget_constructors warning.

  @override
  Widget build(BuildContext context) => Container();
}

class NoConstConstructor extends StatelessWidget {
  // LINT: Missing const constructor generates prefer_const_constructors_in_immutables warning.
  NoConstConstructor({Key? key, required this.name }) : super(key: key);

  final String name;

  @override
  Widget build(BuildContext context) {
    // NO LINT: Can type local variables without omit_local_variable_types warning.
    final String text = 'Hello $name';

    return Container(
      // LINT: "Color(0x1)" generates use_full_hex_values_for_flutter_colors warning.
      color: const Color(0x1),
      child: Text(text),
    );
  }
}

Future<void> playAsync(AnimationController controller) async {
  // NO LINT: AnimationController API can be called without await and without
  // marking Future as unawaited, https://github.com/dart-lang/linter/issues/2513.
  controller.forward();
}

Future<void> pushAsync(NavigatorState navigator) async {
  // NO LINT: Navigator API can be called without await and without
  // marking Future as unawaited, https://github.com/dart-lang/linter/issues/2513.
  navigator.pushNamed('foo');
}

// NO LINT: Can extend ChangeNotifier without warning, https://github.com/dart-lang/sdk/issues/45343.
class ExtendingChangeNotifier extends ChangeNotifier { }

// NO LINT: Can mixin ChangeNotifier without warning, https://github.com/dart-lang/sdk/issues/45343.
class MixingChangeNotifier with ChangeNotifier { }

// NO LINT: Can extend WidgetsBindingObserver without warning, https://github.com/dart-lang/sdk/issues/45343.
class ExtendingWidgetsBindingObserver extends WidgetsBindingObserver { }

// NO LINT: Can mixin WidgetsBindingObserver without warning, https://github.com/dart-lang/sdk/issues/45343.
class MixingWidgetsBindingObserver with WidgetsBindingObserver { }
