如何在 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你调用的方法并没有真正起作用。 如果您的问题仍然存在,请让我更新!