diff --git a/packages/flutter_tools/lib/src/localizations/gen_l10n.dart b/packages/flutter_tools/lib/src/localizations/gen_l10n.dart index deab1c8fe0d..aeaec77a540 100644 --- a/packages/flutter_tools/lib/src/localizations/gen_l10n.dart +++ b/packages/flutter_tools/lib/src/localizations/gen_l10n.dart @@ -1169,6 +1169,7 @@ class LocalizationsGenerator { .replaceAll('@(supportedLanguageCodes)', supportedLanguageCodes.join(', ')) .replaceAll('@(messageClassImports)', sortedClassImports.join('\n')) .replaceAll('@(delegateClass)', delegateClass) + .replaceAll('@(requiresFoundationImport)', _useDeferredLoading ? '' : "import 'package:flutter/foundation.dart';") .replaceAll('@(requiresIntlImport)', _containsPluralMessage() ? "import 'package:intl/intl.dart' as intl;" : '') .replaceAll('@(canBeNullable)', _usesNullableGetter ? '?' : '') .replaceAll('@(needsNullCheck)', _usesNullableGetter ? '' : '!'); diff --git a/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart b/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart index da7cc5098d7..01b3d4789e7 100644 --- a/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart +++ b/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart @@ -12,8 +12,7 @@ const String fileTemplate = ''' @(header) import 'dart:async'; -// ignore: unused_import -import 'package:flutter/foundation.dart'; +@(requiresFoundationImport) import 'package:flutter/widgets.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; @@ -74,7 +73,6 @@ import 'package:intl/intl.dart' as intl; abstract class @(class) { @(class)(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - // ignore: unused_field final String localeName; static @(class)@(canBeNullable) of(BuildContext context) { diff --git a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart index d5b1a6b5ded..28c8f33c59d 100644 --- a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart +++ b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart @@ -57,6 +57,9 @@ const String singleZhMessageArbFileString = ''' const String intlImportDartCode = ''' import 'package:intl/intl.dart' as intl; '''; +const String foundationImportDartCode = ''' +import 'package:flutter/foundation.dart'; +'''; void _standardFlutterDirectoryL10nSetup(FileSystem fs) { final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') @@ -1882,6 +1885,60 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e expect(localizationsFile, contains(intlImportDartCode)); }); + testUsingContext('foundation package import should be omitted from file template when deferred loading = true', () { + fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) + ..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) + ..childFile('app_es.arb').writeAsStringSync(singleEsMessageArbFileString); + + final LocalizationsGenerator generator = LocalizationsGenerator(fs); + try { + generator.initialize( + inputPathString: defaultL10nPathString, + outputPathString: defaultL10nPathString, + templateArbFileName: defaultTemplateArbFileName, + outputFileString: defaultOutputFileString, + classNameString: defaultClassNameString, + useDeferredLoading: true, + ); + generator.loadResources(); + generator.writeOutputFiles(BufferLogger.test()); + } on Exception catch (e) { + fail('Generating output files should not fail: $e'); + } + + final String localizationsFile = fs.file( + fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'), + ).readAsStringSync(); + expect(localizationsFile, isNot(contains(foundationImportDartCode))); + }); + + testUsingContext('foundation package import should be kept in file template when deferred loading = false', () { + fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) + ..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) + ..childFile('app_es.arb').writeAsStringSync(singleEsMessageArbFileString); + + final LocalizationsGenerator generator = LocalizationsGenerator(fs); + try { + generator.initialize( + inputPathString: defaultL10nPathString, + outputPathString: defaultL10nPathString, + templateArbFileName: defaultTemplateArbFileName, + outputFileString: defaultOutputFileString, + classNameString: defaultClassNameString, + useDeferredLoading: false, + ); + generator.loadResources(); + generator.writeOutputFiles(BufferLogger.test()); + } on Exception catch (e) { + fail('Generating output files should not fail: $e'); + } + + final String localizationsFile = fs.file( + fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'), + ).readAsStringSync(); + expect(localizationsFile, contains(foundationImportDartCode)); + }); + testUsingContext('check for string interpolation rules', () { const String enArbCheckList = ''' {