diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 98daf9c9cd2..e4e193db215 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -1556,7 +1556,9 @@ abstract class FlutterCommand extends Command { int? intArg(String name) => argResults?[name] as int?; /// Gets the parsed command-line option named [name] as `List`. - List stringsArg(String name) => argResults?[name] as List? ?? []; + List stringsArg(String name) { + return argResults![name]! as List? ?? []; + } } /// A mixin which applies an implementation of [requiredArtifacts] that only diff --git a/packages/flutter_tools/test/general.shard/args_test.dart b/packages/flutter_tools/test/general.shard/args_test.dart index 0240fe8369c..569006bab8c 100644 --- a/packages/flutter_tools/test/general.shard/args_test.dart +++ b/packages/flutter_tools/test/general.shard/args_test.dart @@ -72,6 +72,36 @@ void main() { expect(command.stringArgDeprecated('key'), 'value'); expect(() => command.stringArgDeprecated('empty'), throwsA(const TypeMatcher())); }); + + testUsingContext('List safe argResults', () async { + final DummyFlutterCommand command = DummyFlutterCommand( + commandFunction: () async { + return const FlutterCommandResult(ExitStatus.success); + } + ); + final FlutterCommandRunner runner = FlutterCommandRunner(verboseHelp: true); + command.argParser.addMultiOption( + 'key', + allowed: ['a', 'b', 'c'], + ); + // argResults will be null at this point, if attempt to read them is made, + // exception `Null check operator used on a null value` would be thrown. + expect(() => command.stringsArg('key'), throwsA(const TypeMatcher())); + + runner.addCommand(command); + await runner.run(['dummy', '--key', 'a']); + + // throws error when trying to parse non-existent key. + expect(() => command.stringsArg('empty'),throwsA(const TypeMatcher())); + + expect(command.stringsArg('key'), ['a']); + + await runner.run(['dummy', '--key', 'a', '--key', 'b']); + expect(command.stringsArg('key'), ['a', 'b']); + + await runner.run(['dummy']); + expect(command.stringsArg('key'), []); + }); } void verifyCommandRunner(CommandRunner runner) {