背景
flutter_localizations
来本地化我的应用程序。build_runner
来生成文件。 (riverpod
、freezed
等)。pubspec.yaml
...
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: 0.18.1
...
dev_dependencies:
build_runner: ^2.4.8
flutter_gen: ^5.4.0
...
flutter:
generate: true
...
l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
some_widget.dart
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class SomeWidget extends StatelessWidget {
const SomeWidget({super.key});
@override
Widget build(BuildContext context) {
return Text(AppLocalizations.of(context).someText);
}
}
问题
flutter_gen
是问题所在。我必须将包:flutter_gen添加到开发依赖项中。
为什么我必须添加这个
按照官方Flutter Doc实现本地化后,运行命令
dart run build_runner build
会出现错误(Bad state: Unable to generate package graph
)。 此处对此进行了讨论。通过添加flutter_gen
解决了。
添加
flutter_gen
会导致问题
包含本地化代码的文件,例如:
AppLocalizations.of(context).someText
会引发错误:导入行Target of URI doesn't exist: 'package:flutter_gen/gen_l10n/app_localizations.dart'
上的'package:flutter_gen/gen_l10n/app_localizations.dart';
。 here对此进行了解释。简单来说,flutter 在 flutter_gen
下的假包名称下创建了 l10n 生成的文件,这与在 dev 依赖项下添加的真实 flutter_gen
冲突。
我尝试过的
重新启动 VS Code,重新启动 Dart 分析器。
flutter clean,其他各种删除缓存方法。
我正在寻找一种解决方案,可以毫无错误地导入
AppLocalizations
,并且可以毫无错误地运行 build_runner
命令。
由于在假包名
flutter_gen
下生成会导致问题,因此可以通过将生成的文件输出位置更改为源代码(在 lib/ 文件夹下)来防止该问题。
更改:
l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.g.dart # <-- The location where it's generated. Doesn't have to be a `.g.dart`.
output-dir: lib/l10n/generated
synthetic-package: false # <-- We won't reference l10n stuff by the fake package name anymore.
some_widget.dart
import 'package:flutter/material.dart';
import 'package:<project_name>/l10n/generated/app_localizations.g.dart';
class SomeWidget extends StatelessWidget {
const SomeWidget({super.key});
@override
Widget build(BuildContext context) {
return Text(AppLocalizations.of(context).someText);
}
}