Поток StreamBuilder не соединяется - PullRequest
0 голосов
/ 30 марта 2020

Я новичок ie, чтобы трепетать и пытаюсь реализовать приложение, используя базу данных Firebase в реальном времени и StreamBuilder для постоянного отображения данных, обновляющих значения, показанные на экране телефона. Моя проблема в том, что по какой-то причине поток вернет событие данных (snap.hasData = true) только в первый раз, когда я загружаю и запускаю основную часть в emultor, если я перезагружаю сценарий в горячем режиме, мой StreamBuilder не будет build and snap.hasData == false. Я считаю, что код не так, потому что, как я уже говорил, соединение через поток инициализируется при первой установке и запуске приложения в эмуляторе

Вот мой код, initSate и сборка этого экрана.

@override
  void initState() {
    super.initState();
    databaseReference
        .child('growboxs')
        .orderByChild('access')
        .equalTo(widget.user)
        .once()
        .then( (DataSnapshot snapshot) {
      String path2child = snapshot.value.toString();
      path2child =
          'growboxs/' + path2child.substring(1, 18) + '/dashboard';
      reference2Dashboard = FirebaseDatabase.instance.reference().child(path2child);
      progressController = AnimationController(
          vsync: this, duration: Duration(milliseconds: 2000)); //5s
      isLoading = true;
    });
  }

  @override
  Widget build(BuildContext context) {
       return isLoading ?
                 StreamBuilder(
                      stream: reference2Dashboard.onValue,
                      builder: (context, snap) {
                             if (!snap.hasData) {
                                return Center(child: CircularProgressIndicator());
                             }
                      if (snap.hasData && !snap.hasError &&
                           snap.data.snapshot.value != null) {
                              DataSnapshot snapshot = snap.data.snapshot;
                              doble temperature = snapshot.value['Temperature'].toDouble();
                              /* keeps on getting values and updating Widget*/
                             .
                             .
                             .
                 ) : Center(child: CircularProgressIndicator());//StreamBuilder
 }//build

1 Ответ

0 голосов
/ 30 марта 2020

Вы инициализируете reference2Dashboard в initState, initState запускается только после того, как ваше состояние создано в первый раз или после того, как ваше состояние разрушено и должно быть создано снова. Горячая перезагрузка не изменяет ваше состояние, поэтому initState не запускается. Он будет работать снова только после горячего перезапуска.

Вы можете использовать FutureBuilder в своей функции build, передавая результат FutureBuilder в StreamBuilder, не используя initState вообще.

...