use-key-in-widget-constructors

Same as use_key_in_widget_constructors in Dart lints

Path
lint/correctness/use-key-in-widget-constructors
Default
On (recommended)
Origin
Dart lints
Domain
flutter
Rule
494 of 512
recommendedflutter

Require public widget constructors to accept or initialize a Flutter Key. Primary headers supply parameters; their optional this bodies supply constructor annotations and initializers. Diagnostics underline the named constructor identifier, or the type name for unnamed constructors, rather than modifiers or the constructor body.

Invalid

example.dartdart
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';

class MissingConstructor extends StatelessWidget {}

class MissingKey extends StatelessWidget {
  const MissingKey();
}

class WrongTypedKey extends StatelessWidget {
  const WrongTypedKey({String? key});
}
Public widgets should have a constructor with a named `key` parameter.
3
4class MissingConstructor extends StatelessWidget {}
Public widget constructors should accept and forward a named `key` parameter.
6class MissingKey extends StatelessWidget {
7 const MissingKey();
Public widget constructors should accept and forward a named `key` parameter.
10class WrongTypedKey extends StatelessWidget {
11 const WrongTypedKey({String? key});

Valid

example.dartdart
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';

class SuperKey extends StatelessWidget {
  const SuperKey({super.key});
}

class ForwardedKey extends StatelessWidget {
  const ForwardedKey({Key? key}) : super(key: key);
}

class CoalescedKey extends StatelessWidget {
  const CoalescedKey({Key? key}) : super(key: key ?? const Key('fallback'));
}

class HardCodedKey extends StatelessWidget {
  const HardCodedKey() : super(key: const Key('fixed'));
}

class RedirectedKey extends StatelessWidget {
  const RedirectedKey({Key? key}) : this.named(key: key ?? const Key('fallback'));
  const RedirectedKey.named({Key? key}) : super(key: key);
}

class _PrivateWidget extends StatelessWidget {}

class PrivateConstructor extends StatelessWidget {
  const PrivateConstructor._();
}

class FactoryWidget extends StatelessWidget {
  factory FactoryWidget() => throw UnimplementedError();
}

// Supplying the key argument is sufficient even when its type is invalid.
class WrongForwardingType extends StatelessWidget {
  const WrongForwardingType({required String value}) : super(key: value);
}

@visibleForTesting
class TestWidget extends StatelessWidget {}

abstract class WidgetInterface implements Widget {}
abstract class WidgetInterfaceChild extends WidgetInterface {}

abstract class ConstructedWidgetInterface implements Widget {
  ConstructedWidgetInterface();
}

Configure use-key-in-widget-constructors

Set its severity in falcon.json. See the configuration guide.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "use-key-in-widget-constructors": "error"
      }
    }
  }
}

Or silence one occurrence with a suppression comment; the reason is required.

example.dartdart
// falcon-ignore lint/correctness/use-key-in-widget-constructors: <reason>