#flutter #dart
#флаттер #дротик
Вопрос:
Я создаю простой экран загрузки между двумя экранами, на котором я загружаю его до тех пор, пока задача не будет завершена, но я застрял только на экране загрузки.
Navigator.of(context).pushReplacementNamed('/loading');
doTask(context);
void doTask(BuildContext context){
Navigator.of(context).pushReplacementNamed('/secondScreen');
}
Комментарии:
1. пока задача не будет выполнена ?
2. Для простоты я преобразовал его просто в функцию, но все равно он не работает.
Ответ №1:
Я бы предложил вместо этого использовать future builder:
class SecondRoute extends StatelessWidget {
@override
Widget build(context) {
return Scaffold(
appBar: AppBar(),
body: FutureBuilder(
future: doTask(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Loading();
}
return SecondScreen();
}),
);
}
Future<void> doTask() async {
// Any future process here
await Future.delayed(
Duration(seconds: 3),
);
}
}
Ответ №2:
doTask не будет вызван, код не будет работать после Navigator.of(context).push()
. Попробуйте выполнить задачу на экране загрузки, лучше, если вы выполняете свою задачу на втором экране и показываете загрузку, пока задача не завершена.
class SecondRoute extends StatelessWidget {
Future<void> doTask() async {
//Dummy Code, Replace it with your task
await Future.delayed(
Duration(seconds: 2),
);
}
@override
Widget build(context) {
return Scaffold(
appBar: AppBar(),
body: FutureBuilder(
future: doTask(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
return Container(); //Replace it with your widget
}),
);
}
}