Я храню все данные API в кеше. некоторые API имеют более 10000 данных. Время ответа почтальона в пределах одной секунды. но в приложении очень медленно переходить на следующую страницу. Я использовал этот код:
onPressed: () async {
...
}
else {
var token = Token(
id: 1,
token: tokens,
refreshToken: model.data.refreshToken,
);
await storeRegister(_url,tokens);
await storeEquipmentReg(_url,tokens);
await storeSyncLogin(_url,tokens);
await HelperDefCatMaster().deleteDefCatMaster();
await storeDefCatMaster(_url,tokens);
await HelperDefRegisterCat().deleteDefRegisterCat();
await storeDefRegisterCat(_url,tokens);
await HelperDefCatMaster().deleteDefCatRelation();
await storeDefCatRelation(_url,tokens);
await HelperDefCatMaster().deleteWoDescription();
await storeWoDescription(_url,tokens);
await HelperDefCatMaster().deleteCategoryDefect();
await storeCategoryDefect(_url,tokens);
await storeWorkSource(_url,tokens);
await storeWorkTypes(_url,tokens);
await storePriorities(_url,tokens);
await Helper().insert(token);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ListPage(model.data.token)));
}
Функция storePriorities выглядит так:
storePriorities(String url, String token) async {
final response = await http.get(
'${url}/v1.0/Priorities',
headers: {'Authorization': 'Bearer ${token}'},
);
final jsonResponse = json.decode(response.body);
Priorities model = Priorities.fromJson(jsonResponse);
int length = model.data.length;
for (int i = 0; i < length; i++) {
var data = DataPriorities(
i: model.data[i].i,
d: model.data[i].d,
);
await HelperDefCatMaster().insertPriorities(data);
}
}
это помощник базы данных. создать базу данных и создать таблицы и отображать значения
await
для извлечения данных из SQLite.Изменять :
await Helper().insert(token);
Navigator.push(
context,MaterialPageRoute(builder: (context) => ListPage(model.data.token)));
к :
Helper().insert(token).then((onValue) {
Navigator.push(context,MaterialPageRoute(
builder: (context) => ListPage(model.data.token),
),
);
}
Примечание. Сделайте так, чтобы ваш метод insert
возвращал Future<'token's return type'>
Теперь используйте этот способ для всех остальных вызовов await
.
как эти вещи: await storeWoDescription(_url,tokens); await HelperDefCatMaster().deleteCategoryDefect(); await storeCategoryDefect(_url,tokens); Navigator.pop(context); Navigator.push( context, MaterialPageRoute( builder: (context) => ListPage(model.data.token)));
как использовать все остальные вызовы ожидания?
Главное - не использовать await, когда вы не хотите выполнять синхронную операцию. Все ли вызовы await необходимо выполнять по порядку??
нет, но данные отсутствуют при переходе на следующую страницу.
после перехода на следующую страницу и ожидания 10 минут приходят данные
Я показал индикатор выполнения. но вы знаете, что клиент не любит ждать 10 минут
Если вам требуется 10 минут для завершения процесса, вы можете изменить свой подход к сохранению данных. Одна вещь, которую вы можете сделать, это создать класс репозитория и сохранить данные в переменных, перейти на следующую страницу и прочитать данные из этих переменные. и в фоновом режиме синхронизировать эти данные с базой данных. Я надеюсь, что я ясно .. если нет, то, пожалуйста, дайте мне знать ..
Я дал первый ответ, который предлагает использовать await
только тогда, когда это необходимо.
Ну, если вы вставляете слишком много данных в SQLite, я предполагаю, что вы можете использовать что-то вроде этого:
for (int i = 0; i <= 1000; i++) {
db.insert('table_name', dataObject.toMap());
}
Ну, это будет выполнять много транзакций за раз и займет много вашего времени.
Измените это на что-то вроде этого, и это увеличит скорость вставки данных:
Batch batch = db.batch();
for (int i = 0; i <= 1000; i++) {
batch.insert('table_name', dataObject.toMap());
}
await batch.commit();
Что мы делаем здесь, так это то, что в одной транзакции мы делаем несколько вставок за раз.
Я сделал это изменение в своем демонстрационном проекте, где я вставлял 1000 строк за раз, и результаты были отличными. db.insert при вызове 1000 раз заняло 7 секунд, тогда как для вставки того же объема данных для пакетного.insert потребовалось менее 1 секунды.
Если вы оптимизируете свой код с помощью этого решения и используете ожидание, когда это необходимо, вы не должны столкнуться с какими-либо проблемами в пользовательском интерфейсе. Позвольте мне знать, если это помогает.
вау.. работает хорошо. после проверки QA я сообщу вам фактический результат
@kapesh, могу ли я использовать транзакцию для получения данных? Я имею в виду, будет ли это более быстрой операцией?
Что такое HelperDefCatMaster?