Подождите, пока Navigator.pop () завершит работу sh - PullRequest
0 голосов
/ 26 января 2020

У меня есть диалоговое окно поиска, в котором отображается список найденных предметов. Когда пользователь щелкает элемент, я хочу открыть диалоговое окно поиска, затем прочитать и отобразить данные, но чтение - это тяжелая задача.

(Navigator.pop () - это syn c и не является Future )

Если мой код выглядит примерно так:

Navigator.pop(context);
readSelectedItem();

Это замедлит анимацию перехода и сделает просмотр медленным.

Я должен сделать что-то вроде этого что, конечно, грязный код:

Navigator.pop(context);
await Future.delayed(Duration(milliseconds: 200));
readSelectedItem();

1 Ответ

0 голосов
/ 27 января 2020

Пример Dartpad: https://dartpad.dartlang.org/flutter

bool isRead = false;

      @override
      void initState() {
        super.initState();
        readData();
      }

      void readData() async {
        //your long running task
        //once data is read, change bool isRead to true
        isRead = true;
        //if you want to rebuild widgets change it in setState method
      }

      @override
      Widget build(BuildContext context) {
        return Container(
            color: Colors.white,
            alignment: Alignment.center,
            child: RaisedButton(
              onPressed: () {
                show();
              },
              child: Text('Show Dialog', style: TextStyle(color: Colors.white)),
              color: Colors.black,
            ));
      }

      void show() {
        showDialog(
            context: context,
            builder: (con) => WillPopScope(
              onWillPop:()=>Future.value(false),
              child: AlertDialog(
                      title: Text('Title'),
                      content: Text('Your Search widgets...'),
                      actions: [
                        FlatButton(
                            onPressed: () {
                              if (isRead)
                                Navigator.of(context).pop();
                              else {
                                //Disply toast or something !
                              }
                            },
                            child: Text('Close'))
                      ]),
            ));
      }
...