我正在尝试加载我的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 ================================');发布于 2020-06-27 03:30:13
如果json很小,可能不值得将解析转移到不同的隔离,因为此操作也有成本。Small / big是一种次要的东西,但根据常识,我们可能会应用正确的方法。
如果json很大,那么您所做的是正确的,否则dart将在主线程上执行解析,这可能会导致可见的jank。
关于compute不适合您的原因,此函数返回一个Future,而不是这样做
var myJsonParsed = compute(_parseJson, myJson);您需要等待调用才能获得结果,否则将在此处存储未来的'myJson' : myJsonParsed,而不是json地图
var myJsonParsed = await compute(_parseJson, myJson); https://stackoverflow.com/questions/62601505
复制相似问题