diff --git a/lib/src/rules/use_key_in_widget_constructors.dart b/lib/src/rules/use_key_in_widget_constructors.dart index 53c827722..167903908 100644 --- a/lib/src/rules/use_key_in_widget_constructors.dart +++ b/lib/src/rules/use_key_in_widget_constructors.dart @@ -79,6 +79,7 @@ class _Visitor extends SimpleAstVisitor<void> { classElement.isPublic && hasWidgetAsAscendant(classElement) && !isExactWidget(classElement) && + !_hasKeySuperParameterInitializerArg(node) && !node.initializers.any((initializer) { if (initializer is SuperConstructorInvocation) { var staticElement = initializer.staticElement; @@ -98,12 +99,23 @@ class _Visitor extends SimpleAstVisitor<void> { super.visitConstructorDeclaration(node); } - bool _defineKeyParameter(ConstructorElement element) => - element.parameters.any((e) => e.name == 'key' && _isKeyType(e.type)); - bool _defineKeyArgument(ArgumentList argumentList) => argumentList.arguments .any((a) => a.staticParameterElement?.name == 'key'); + bool _defineKeyParameter(ConstructorElement element) => + element.parameters.any((e) => e.name == 'key' && _isKeyType(e.type)); + bool _isKeyType(DartType type) => DartTypeUtilities.implementsInterface(type, 'Key', ''); + + bool _hasKeySuperParameterInitializerArg(ConstructorDeclaration node) { + for (var parameter in node.parameters.parameters) { + var element = parameter.declaredElement; + if (element is SuperFormalParameterElement && element.name == 'key') { + return true; + } + } + + return false; + } } diff --git a/test_data/rules/experiments/super_parameters/analysis_options.yaml b/test_data/rules/experiments/super_parameters/analysis_options.yaml new file mode 100644 index 000000000..16dd3805f --- /dev/null +++ b/test_data/rules/experiments/super_parameters/analysis_options.yaml @@ -0,0 +1,3 @@ +analyzer: + enable-experiment: + - super-parameters diff --git a/test_data/rules/experiments/super_parameters/rules/.mock_packages b/test_data/rules/experiments/super_parameters/rules/.mock_packages new file mode 100644 index 000000000..236a8a870 --- /dev/null +++ b/test_data/rules/experiments/super_parameters/rules/.mock_packages @@ -0,0 +1 @@ +flutter:../../../../mock_packages/flutter/lib/ diff --git a/test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart b/test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart new file mode 100644 index 000000000..7fa56f920 --- /dev/null +++ b/test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart @@ -0,0 +1,19 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// test w/ `dart test -N use_key_in_widget_constructors` + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +/// https://github.com/flutter/flutter/issues/100297 +class OtherWidget extends StatelessWidget { + const OtherWidget({required super.key}); //OK + + @override + Widget build(BuildContext context) { + return Container(); + } +} +