【问题标题】:Is it slow to read data from a json file with rootBundle.loadString?使用 rootBundle.loadString 从 json 文件中读取数据会很慢吗?
【发布时间】:2025-12-18 07:25:02
【问题描述】:

我只是想知道使用 rootBundle.loadString 从资产 json 文件中读取数据是否相对较慢。

我知道这是一个异步进程,我应该等待它,这是否意味着我不应该经常这样做,或者我应该在读取文件时显示加载指示器?还是没那么慢?

【问题讨论】:

  • 你需要使用 FutureBuilder。
  • 如果我正在加载 json 字符串以用其他输入字段填充屏幕中的下拉菜单怎么办?例如,我想我可以在 initState() 中加载字符串吗?这是一种不好的做法吗?
  • 这是一个异步操作,你想用 Future 构建 UI,所以 FutureBuilder 非常适合。

标签: json flutter asynchronous dart


【解决方案1】:

loadString 对大于 10Kb 的文件使用 compute(即运行隔离)(有关最新详细信息,请参阅函数实现)。我发现在某些 Android 设备(例如,Samsung J5 2017)上隔离工作(或启动,无关紧要)速度很慢。不知道为什么——这个架构是慢速设备还是一些多线程调用问题。所以你可以直接使用'rootBundle.load()',比如:

Future<String> loadString(String key) async {
    final ByteData data = await rootBundle.load(key);
    return utf8.decode(data.buffer.asUint8List());
}

【讨论】:

    【解决方案2】:

    loadString 返回一个 Future,因此您可以使用 FutureBuilder 从未来数据中构建下拉列表。

    // other code
    
    FutureBuilder(
        future: rootBundle.loadString('path-to-file.json'),
        builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
                // return a widget using snapshot's data.
            }
            // handle other connectionStats.
        },
    ),
    
    // other code
    

    【讨论】: