Загрузочный экран застревает во флаттере

#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
          }),
    );
  }
}