如何在 Flutter 中加载本地化的 JSON 资源
How to load localized JSON asset in Flutter
我有一个本地化的 Android Flutter 应用程序。我按照这些 instructions 配置了本地化。这行得通(尽管感觉不必要地复杂),并且我能够在整个应用程序中使用本地化字符串,但我不知道如何加载本地化资产 JSON 文件。
我尝试将资产路径存储为本地化字符串。但是,当我尝试从 statefull 小部件的 initState
加载路径时,出现错误。
@override
void initState() {
var t = AppLocalizations.of(context);
await rootBundle.load(t!.localizedJsonPath);
super.initState();
}
FlutterError (dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _MyScreenState.initState() completed.
请注意,如果我对 JSON 资产文件路径进行硬编码,则上述方法可以正常工作。它仅在我尝试加载本地化字符串时失败。
我做错了什么?
如果有更好的方法来加载本地化资产,我会接受它作为答案。 Flutter 文档提到 asset variants 用于图像分辨率和主题,但我找不到任何用于本地化的内容。
您遇到的错误似乎与您的上下文有关。
var t = AppLocalizations.of(context);
在 initState 内部被调用。但是,您的初始状态在您的小部件具有上下文之前被调用,因为它尚未构建。所以你可以尝试做的是使用 didChangeDependencies()
而不是 initState,像这样:
@override
void didChangeDependencies() {
var t = AppLocalizations.of(context);
await rootBundle.load(t!.localizedJsonPath);
super.didChangeDependencies();
}
还有一件事:初始状态不是异步的,所以尝试await
你调用的方法并没有真正起作用。
如果您的问题仍然存在,请让我更新!
我有一个本地化的 Android Flutter 应用程序。我按照这些 instructions 配置了本地化。这行得通(尽管感觉不必要地复杂),并且我能够在整个应用程序中使用本地化字符串,但我不知道如何加载本地化资产 JSON 文件。
我尝试将资产路径存储为本地化字符串。但是,当我尝试从 statefull 小部件的 initState
加载路径时,出现错误。
@override
void initState() {
var t = AppLocalizations.of(context);
await rootBundle.load(t!.localizedJsonPath);
super.initState();
}
FlutterError (dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _MyScreenState.initState() completed.
请注意,如果我对 JSON 资产文件路径进行硬编码,则上述方法可以正常工作。它仅在我尝试加载本地化字符串时失败。
我做错了什么?
如果有更好的方法来加载本地化资产,我会接受它作为答案。 Flutter 文档提到 asset variants 用于图像分辨率和主题,但我找不到任何用于本地化的内容。
您遇到的错误似乎与您的上下文有关。
var t = AppLocalizations.of(context);
在 initState 内部被调用。但是,您的初始状态在您的小部件具有上下文之前被调用,因为它尚未构建。所以你可以尝试做的是使用 didChangeDependencies()
而不是 initState,像这样:
@override
void didChangeDependencies() {
var t = AppLocalizations.of(context);
await rootBundle.load(t!.localizedJsonPath);
super.didChangeDependencies();
}
还有一件事:初始状态不是异步的,所以尝试await
你调用的方法并没有真正起作用。
如果您的问题仍然存在,请让我更新!