首页 > 解决方案 > 如何在隔离中加载和解析 Json?

问题描述

我正在尝试加载我的 json 并将其解析为新的隔离区。如果我理解正确,这可以提高应用程序的性能。

我向我的 json 收费并在我未来的构建者之后对其进行解析。我想在隔离之前解析它并将它们全部返回,但我无法显示我的 json。

这是正确的方法还是没用?

Future<Map<String, dynamic>> loadJson() async {
  /*
  * I load my Json without other isolate and I parse it in the future builder
  */
  final myJson = await rootBundle.loadString('assets/jsons/myJson.json');

  return {
    'myJson' : myJson
  };
}

Future<Map<String, dynamic>> loadJsonParsed() async {
  /*
  * I load my Json and parse it in other isolate
  */
  final myJson = await rootBundle.loadString('assets/jsons/myJson.json');
  var myJsonParsed = compute(_parseJson, myJson);

  return {
    'myJson' : myJsonParsed
  };
}
Map<String, dynamic>_parseJson(String responseBody) {
  final parsed = jsonDecode(responseBody);
  return parsed;
}

// Some code ...

@override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (() => FocusScope.of(context).requestFocus(FocusNode())),
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder(
          future: Future.wait([loadJson(), loadJsonParsed()]),
          builder: (context, snapshot) {
            if(snapshot.hasError) print(snapshot.error);
            if (!snapshot.hasData) {
              return LinearProgressIndicator();
            }

            print('BEGIN ================================');
            var myJson = json.decode(snapshot.data[0]['myJson']);
            print(myJson); // I see my json !
            print(myJson.runtimeType); // _InternalLinkedHashMap<String, dynamic>
            print('SEPARATION ================================');
            var myJsonParsed = snapshot.data[1]['myJson'];
            print(myJsonParsed); // Instance of 'Future<Map<String,dynamic>>' How to do ?
            print(myJsonParsed.runtimeType); // Future<Map<String,dynamic>>
            print('END ================================');

标签: flutterdart

解决方案


如果 json 很小,则可能不值得将解析移至不同的隔离,因为此操作也有成本。小/大是主观的,但使用常识,我们可能会应用正确的方法。

如果 json 很大,那么你肯定是在做正确的事情,否则 dart 会在主线程上执行解析,这可能会导致可见的卡顿。

关于为什么compute对您不起作用,此函数返回一个Futureso 而不是这样做

var myJsonParsed = compute(_parseJson, myJson);

您需要等待调用以获取结果,否则您将在此处存储未来'myJson' : myJsonParsed而不是json地图

var myJsonParsed = await compute(_parseJson, myJson); 

推荐阅读