Флаттер Навигация от Firestore Flag - PullRequest
0 голосов
/ 21 апреля 2020

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

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

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

  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. Может быть, это помечено как «asyn c». 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)

1 Ответ

0 голосов
/ 21 апреля 2020

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

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

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

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

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

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

...