flutter - 如何在隔离中加载和解析 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 ================================');
解决方案
如果 json 很小,则可能不值得将解析移至不同的隔离,因为此操作也有成本。小/大是主观的,但使用常识,我们可能会应用正确的方法。
如果 json 很大,那么你肯定是在做正确的事情,否则 dart 会在主线程上执行解析,这可能会导致可见的卡顿。
关于为什么compute
对您不起作用,此函数返回一个Future
so 而不是这样做
var myJsonParsed = compute(_parseJson, myJson);
您需要等待调用以获取结果,否则您将在此处存储未来'myJson' : myJsonParsed
而不是json
地图
var myJsonParsed = await compute(_parseJson, myJson);
推荐阅读
- sql - sql-server 2008 r2 连接两个字符串
- android - 使用 ViewPager 添加时 Tablayout 项目消失
- java - 如何从 Android Room 中的多个数据库中进行选择(如何附加数据库)
- python - 当我尝试启动 celery/supervisor 实例时出现“错误(生成错误)”
- reactjs - 反应 axios 获取方法
- abap - 计算内部表中的重复项?
- python-3.x - 尝试在 Python 中通信时出错
- python - 蟒蛇在我的字母猜谜游戏中遇到困难
- html - 如何以角度更改特定垫表列条目的字体颜色?
- javascript - 如何在 reactjs 中访问 componentWillMount() 中的变量值