【问题标题】:Using Futures to load config.json in Flutter在 Flutter 中使用 Futures 加载 config.json
【发布时间】:2018-04-27 22:30:17
【问题描述】:

作为 Dart/Flutter 的新手,我正在使用这个 sn-p 尝试加载我存储在资产文件夹中的 config.json 文件。在尝试读取此文件时,我使用 Dart 语言 Futures documentationFlutter docs on reading local text files 上的模型:

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';

Future<List> loadAsset() async {
  String raw = await rootBundle.loadString('assets/config.json');
  List configData = json.decode(raw);
  return configData;
}

然后,在我的班级中,我尝试将配置加载到列表中,如下所示:

Future<List> configData = loadAsset();
print(configData.toString());
// prints out: Instance of 'Future<List<dynamic>>'

这一切的结果似乎奏效了。然而我找不到使用我加载的数据的方法。访问列表中元素的任何努力,例如configData[0] 导致错误:

The following _CompileTimeError was thrown building 
HomePage(dirty, state: HomePageState#b1af8):
'package:myapp/pages/home_page.dart': error: 
line 64 pos 19: lib/pages/home_page.dart:64:19:
Error: The method '[]' isn't defined for the class 
'dart.async::Future<dart.core::List<dynamic>>'.
Try correcting the name to the name of an existing method, 
or defining a method named '[]'.

我想将configDataFuture 转换为我可以读取并在我的应用程序中传递的普通对象。我可以做一些非常相似的事情,并让它在一个小部件的构建方法中工作,使用 FutureBuilderDefaultAssetBundle 因此......

DefaultAssetBundle
.of(context)
.loadString('assets/config.json')

...但我不希望在所有需要它的小部件中重新加载数据的开销。我想在一个单独的 Dart 包中加载,并将其作为全局配置提供给我的所有应用程序。任何指针将不胜感激。


我已经尝试过 Rémi Rousselet 的建议:

List configData = await loadAsset();
print(configData[0]);

在这种情况下,我得到一个编译器错误:

compiler message: lib/pages/home_page.dart:55:21: Error: Getter not found: 'await'.
compiler message:     List configData = await loadAsset();
compiler message:                       ^^^^^

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    你不能这样做 configData[0] 因为 configData 不是 List 而是 Future

    相反,等待未来访问内部的List

    List configData = await loadAsset();
    print(configData[0]);
    

    【讨论】:

    • 谢谢。可悲的是,这不起作用,我觉得我错过了一些明显的东西。尝试您的解决方案后,我已在底部的错误消息中更新了我的问题。因为你的回答看起来合乎逻辑,所以我投了赞成票。
    • 你的函数需要异步
    • 你对这个@gauden有什么运气吗,我自己也有类似的问题。
    • @user2387962 — 我继续对配置进行硬编码,因为我正在开发的应用程序仅供我自己使用。但我需要回到这一点,因为如果应用程序获得超过一个用户,那将无法正常工作!
    • 感谢@Ringi,我实际上已经解决了问题。这是我的问题,如果它有什么好处。 stackoverflow.com/questions/53288493/…。我也有解决方案的要点。 gist.github.com/horgag1/c4ce662e62d3a0a7ace0648697651dbe
    【解决方案2】:

    您只能使用 await INSIDE 异步方法。

    如果你想在整个应用程序中使用你的资产,你想在类似于这样的 main 方法中加载资产。

    void main() async {
      StorageUtils.localStorage = await SharedPreferences.getInstance();
    }
    

    现在您可以在整个应用程序中同步使用 localStorage,而无需处理另一个异步调用或再次加载它。

    不同的例子,相同的原理。

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多