【问题标题】:How to load localized JSON asset in Flutter如何在 Flutter 中加载本地化的 JSON 资源
【发布时间】:2021-12-14 23:20:48
【问题描述】:

我有一个本地化的 Android Flutter 应用。我按照这些instructions 配置了本地化。这行得通(虽然感觉不必要地复杂),而且我能够在整个应用程序中使用本地化字符串,但我不知道如何加载本地化资产 JSON 文件。

我尝试将资产路径存储为本地化字符串。但是,当我尝试从 statefull 小部件的 initState 加载路径时,出现错误。

@override
void initState() {
    var t = AppLocalizations.of(context);
    await rootBundle.load(t!.localizedJsonPath);
    super.initState();
}

FlutterError (dependOnInheritedWidgetOfExactType<_localizationsscope>() 或dependOnInheritedElement() 在_MyScreenState.initState() 完成之前被调用。

请注意,如果我对 JSON 资产文件路径进行硬编码,上述方法可以正常工作。只有当我尝试加载本地化字符串时它才会失败。

我做错了什么?

如果有更好的方法来加载本地化资产,我会接受它作为答案。 Flutter 文档提到 asset variants 用于图像分辨率和主题,但我找不到任何本地化内容。

【问题讨论】:

    标签: android flutter dart localization


    【解决方案1】:

    您遇到的错误似乎与您的上下文有关。

    var t = AppLocalizations.of(context);
    

    在 initState 中被调用。但是,您的初始化状态在您的小部件具有上下文之前被调用,因为它尚未构建。所以你可以尝试做的是使用didChangeDependencies()而不是initState,就像这样:

    @override
      void didChangeDependencies() {
            var t = AppLocalizations.of(context);
            await rootBundle.load(t!.localizedJsonPath);
        super.didChangeDependencies();
      }
    

    还有一件事:初始化状态不是异步的,所以尝试await 你调用的方法并没有真正起作用。 如果您的问题仍然存在,请及时通知我!

    【讨论】:

    • didChangeDependencies 是异步的吗?有问题吗?
    • 也没有。但不是真正的问题,因为你有一个解决方案。建议你看看this
    猜你喜欢
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2013-11-03
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多