异步和等待任务需要太多时间
Async and await tasks take too much time
我需要在登录前调用所有API 并存储一个本地数据库。我使用了 sqflite 插件。 无法添加背景运行,这就是我使用await的原因。
第一个 运行 storeRegister() 过程完成后,然后 运行 storeEquipmentReg 同样。
按钮 onPressed():
await HelperDatabase1().storeRegister(_url, tokens);
await HelperDatabase1().storeEquipmentReg(_url, tokens);
await HelperDatabase1().storeGetUserPreference(_url, tokens);
await HelperDatabase1().storeDefRegisterCat(_url, tokens);
await HelperDatabase1().storeDefCatMaster(_url, tokens);
await HelperDatabase1().storeDefCatRelation(_url, tokens);
await HelperDatabase1().storeWoDescription(_url, tokens);
await HelperDatabase1().storeAssetAssembly(_url, tokens);
await HelperDatabase1().storeCategoryDefect(_url, tokens);
await HelperDatabase1().storeWorkSource(_url, tokens);
await HelperDatabase1().storeWorkTypes(_url, tokens);
await HelperDatabase1().storePriorities(_url, tokens);
await HelperDatabase1().storeSignIn(1);
await HelperSync().insert(_url, tokens);
await Helper().insert(token);
Navigator.pop(context);
Navigator.of(context).pushNamedAndRemoveUntil('/listView', (Route<dynamic> route) => false);
storeCategoryDefect 方法示例:(所有其他代码相同)
storeCategoryDefect(String url, String token) async {
var db = await db1;
Batch batch = db.batch();
final response = await http.get(
'$url/nativeapi/v1.0/CategoryDefect',
headers: {'Authorization': 'Bearer $token'},
);
final jsonResponse = json.decode(response.body);
CategoryDefect model = CategoryDefect.fromJson(jsonResponse);
int length = model.data.length;
for (int i = 0; i < length; i++) {
var data = DataCategoryDefect(
i: model.data[i].i,
d: model.data[i].d,
);
batch.insert(
'CategoryDefectTable',
data.toMap(),
);
}
await batch.commit();
}
如果您不需要按特定顺序执行它们,您可以像这样同时执行它们:
await Future.wait([
HelperDatabase1().storeRegister(_url, tokens),
HelperDatabase1().storeEquipmentReg(_url, tokens),
HelperDatabase1().storeGetUserPreference(_url, tokens),
HelperDatabase1().storeDefRegisterCat(_url, tokens),
HelperDatabase1().storeDefCatMaster(_url, tokens),
HelperDatabase1().storeDefCatRelation(_url, tokens),
HelperDatabase1().storeWoDescription(_url, tokens),
HelperDatabase1().storeAssetAssembly(_url, tokens),
HelperDatabase1().storeCategoryDefect(_url, tokens),
HelperDatabase1().storeWorkSource(_url, tokens),
HelperDatabase1().storeWorkTypes(_url, tokens),
HelperDatabase1().storePriorities(_url, tokens),
HelperDatabase1().storeSignIn(1),
HelperSync().insert(_url, tokens),
Helper().insert(token),
]);
如果您需要订购它们,请像您的示例那样创建 await Future.wait
批次。例如,第一个 Future.wait 内的第一个优先级,第二个在第一个 Future.wait 之后 bla bla...
我需要在登录前调用所有API 并存储一个本地数据库。我使用了 sqflite 插件。 无法添加背景运行,这就是我使用await的原因。
第一个 运行 storeRegister() 过程完成后,然后 运行 storeEquipmentReg 同样。
按钮 onPressed():
await HelperDatabase1().storeRegister(_url, tokens);
await HelperDatabase1().storeEquipmentReg(_url, tokens);
await HelperDatabase1().storeGetUserPreference(_url, tokens);
await HelperDatabase1().storeDefRegisterCat(_url, tokens);
await HelperDatabase1().storeDefCatMaster(_url, tokens);
await HelperDatabase1().storeDefCatRelation(_url, tokens);
await HelperDatabase1().storeWoDescription(_url, tokens);
await HelperDatabase1().storeAssetAssembly(_url, tokens);
await HelperDatabase1().storeCategoryDefect(_url, tokens);
await HelperDatabase1().storeWorkSource(_url, tokens);
await HelperDatabase1().storeWorkTypes(_url, tokens);
await HelperDatabase1().storePriorities(_url, tokens);
await HelperDatabase1().storeSignIn(1);
await HelperSync().insert(_url, tokens);
await Helper().insert(token);
Navigator.pop(context);
Navigator.of(context).pushNamedAndRemoveUntil('/listView', (Route<dynamic> route) => false);
storeCategoryDefect 方法示例:(所有其他代码相同)
storeCategoryDefect(String url, String token) async {
var db = await db1;
Batch batch = db.batch();
final response = await http.get(
'$url/nativeapi/v1.0/CategoryDefect',
headers: {'Authorization': 'Bearer $token'},
);
final jsonResponse = json.decode(response.body);
CategoryDefect model = CategoryDefect.fromJson(jsonResponse);
int length = model.data.length;
for (int i = 0; i < length; i++) {
var data = DataCategoryDefect(
i: model.data[i].i,
d: model.data[i].d,
);
batch.insert(
'CategoryDefectTable',
data.toMap(),
);
}
await batch.commit();
}
如果您不需要按特定顺序执行它们,您可以像这样同时执行它们:
await Future.wait([
HelperDatabase1().storeRegister(_url, tokens),
HelperDatabase1().storeEquipmentReg(_url, tokens),
HelperDatabase1().storeGetUserPreference(_url, tokens),
HelperDatabase1().storeDefRegisterCat(_url, tokens),
HelperDatabase1().storeDefCatMaster(_url, tokens),
HelperDatabase1().storeDefCatRelation(_url, tokens),
HelperDatabase1().storeWoDescription(_url, tokens),
HelperDatabase1().storeAssetAssembly(_url, tokens),
HelperDatabase1().storeCategoryDefect(_url, tokens),
HelperDatabase1().storeWorkSource(_url, tokens),
HelperDatabase1().storeWorkTypes(_url, tokens),
HelperDatabase1().storePriorities(_url, tokens),
HelperDatabase1().storeSignIn(1),
HelperSync().insert(_url, tokens),
Helper().insert(token),
]);
如果您需要订购它们,请像您的示例那样创建 await Future.wait
批次。例如,第一个 Future.wait 内的第一个优先级,第二个在第一个 Future.wait 之后 bla bla...