Flutter Navigation от Firestore Flag

Схема того, что я хочу сделать] 1

Я хочу перейти к Screen2 с screen1, когда значение screen2_flag изменится на true (в облачном хранилище firebase),

У меня есть экран 1, как показано на диаграмме, который отлично работает до тех пор, пока значение screen2_flag не станет ложным, когда я изменяю значение flag с false на true.

  void initState() {
    super.initState();

    DocumentReference reference =
        Firestore.instance.collection('myColection').document('myDoc');
    reference.snapshots().listen((querySnapshot) {
      print('got sanpshot' + querySnapshot.data['screen2_flag'].toString());
      if (querySnapshot.data['screen2_flag'].toString() == 'true') {
        Navigator.pushNamed(context, screen2.id);
      }
    });


   Widget build(BuildContext context) {
      // my code 
    ...

   }


  }

Я могу видеть screen2 на моем эмуляторе. Но ошибка ниже на консоли

[ОШИБКА: flutter / lib / ui / ui_dart_state.cc (157)] Необработанное исключение: аргумент обратного вызова setState () вернул Future. E / flutter (24551): метод setState () в _WaitingRoomState # 25dfa был вызван с закрытием или методом, который вернул Future. Может быть, он помечен как «асинхронный». E / flutter (24551): вместо выполнения асинхронной работы внутри вызова setState () сначала выполните работу (без обновления состояния виджета), а затем синхронно обновите состояние внутри вызова setState (). E / flutter (24551): # 0 State.setState. (пакет: flutter / src / widgets / framework.dart: 1151: 9) E / flutter (24551): # 1 State.setState (пакет: flutter / src / widgets / framework.dart: 1167: 6)


person Ramit Dour    schedule 20.04.2020    source источник


Ответы (1)


Ошибка сообщила вам о проблеме:

Аргумент обратного вызова setState () вернул Future

Метод setState () в _WaitingRoomState # 25dfa был вызван с закрытием или методом, который вернул Future

и сказал вам также решение:

Вместо выполнения асинхронной работы внутри вызова setState () сначала выполните работу (без обновления состояния виджета), а затем синхронно обновите состояние внутри вызова setState ()

Итак, вы выполняете асинхронный вызов, ждете его, пока не получите значение флага (как я полагаю, потому что вы не показали эту часть кода), а затем вызываете setState() с обновленными новыми значениями.

person Haidar Mehsen    schedule 20.04.2020