diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 27117808b3f..aa6bc7faad9 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -95,6 +95,11 @@ class CreateCommand extends FlutterCommand { help: 'The organization responsible for your new Flutter project, in reverse domain name notation. ' 'This string is used in Java package names and as prefix in the iOS bundle identifier.' ); + argParser.addOption( + 'project-name', + defaultsTo: null, + help: 'The project name for this new Flutter project. This must be a valid dart package name.' + ); argParser.addOption( 'ios-language', abbr: 'i', @@ -235,12 +240,12 @@ class CreateCommand extends FlutterCommand { ); } } - final String projectName = fs.path.basename(projectDirPath); String error = _validateProjectDir(projectDirPath, flutterRoot: flutterRoot); if (error != null) throwToolExit(error); + final String projectName = argResults['project-name'] ?? fs.path.basename(projectDirPath); error = _validateProjectName(projectName); if (error != null) throwToolExit(error); diff --git a/packages/flutter_tools/test/commands/create_test.dart b/packages/flutter_tools/test/commands/create_test.dart index c11c1e7aae2..e72171d899b 100644 --- a/packages/flutter_tools/test/commands/create_test.dart +++ b/packages/flutter_tools/test/commands/create_test.dart @@ -298,6 +298,31 @@ void main() { ); }, timeout: allowForCreateFlutterProject); + testUsingContext('plugin project with valid custom project name', () async { + return _createProject( + projectDir, + ['--no-pub', '--template=plugin', '--project-name', 'xyz'], + [ + 'android/src/main/java/com/example/xyz/XyzPlugin.java', + 'example/android/app/src/main/java/com/example/xyzexample/MainActivity.java', + ], + unexpectedPaths: [ + 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', + 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', + ], + ); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('plugin project with invalid custom project name', () async { + expect( + () => _createProject(projectDir, + ['--no-pub', '--template=plugin', '--project-name', 'xyz.xyz'], + [], + ), + throwsToolExit(message: '"xyz.xyz" is not a valid Dart package name.'), + ); + }, timeout: allowForCreateFlutterProject); + testUsingContext('legacy app project with-driver-test', () async { return _createAndAnalyzeProject( projectDir,