diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 8e18a7ab5ea..b18a4c6e6b5 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -297,6 +297,16 @@ class CreateCommand extends FlutterCommand with CreateBase { final String? sampleArgument = stringArg('sample'); final bool emptyArgument = boolArg('empty'); final FlutterTemplateType template = _getProjectType(projectDir); + + if (template == FlutterTemplateType.pluginFfi) { + globals.printWarning( + 'The "plugin_ffi" template is deprecated and will be removed in a future ' + 'version of Flutter. Use the "package_ffi" template instead. ' + 'For more information, see: ' + 'https://docs.flutter.dev/platform-integration/bind-native-code', + ); + } + if (sampleArgument != null) { if (template != FlutterTemplateType.app) { throwToolExit( diff --git a/packages/flutter_tools/lib/src/flutter_project_metadata.dart b/packages/flutter_tools/lib/src/flutter_project_metadata.dart index d9c21a2af8c..f207d8e8033 100644 --- a/packages/flutter_tools/lib/src/flutter_project_metadata.dart +++ b/packages/flutter_tools/lib/src/flutter_project_metadata.dart @@ -109,9 +109,10 @@ enum FlutterTemplateType implements ParsedFlutterTemplateType { /// This is an FFI native plugin project. pluginFfi( helpText: - 'Generate a shareable Flutter project containing an API ' + '(deprecated) Generate a shareable Flutter project containing an API ' 'in Dart code with a platform-specific implementation through dart:ffi for Android, iOS, ' - 'Linux, macOS, Windows, or any combination of these.', + 'Linux, macOS, Windows, or any combination of these. ' + 'Use "package_ffi" instead.', ); const FlutterTemplateType({required this.helpText}); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart index 9d5a45d854d..11443956212 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart @@ -281,6 +281,14 @@ void main() { ), }, ); + + testUsingContext('plugin_ffi template is marked as deprecated in help', () { + final command = CreateCommand(); + final String? templateHelp = + command.argParser.options['template']?.allowedHelp?['plugin_ffi']; + expect(templateHelp, contains('(deprecated)')); + expect(templateHelp, contains('Use "package_ffi" instead.')); + }); }); } diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart index 5d5a0e33fa5..0bcee55dec7 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart @@ -4279,6 +4279,25 @@ void main() { ); }); + testUsingContext('plugin_ffi template shows deprecation warning', () async { + final command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run([ + 'create', + '--no-pub', + '--template=plugin_ffi', + '--platforms=android', + projectDir.path, + ]); + expect(logger.warningText, contains('The "plugin_ffi" template is deprecated')); + expect(logger.warningText, contains('Use the "package_ffi" template instead.')); + expect( + logger.warningText, + contains('https://docs.flutter.dev/platform-integration/bind-native-code'), + ); + }, overrides: {Logger: () => logger}); + testUsingContext( 'should show warning when disabled platforms are selected while creating an FFI plugin', () async {