snapshot.data возвращает значение null в streambuilder, но показывает правильное значение непосредственно перед возвратом модели данных с данными снимка - PullRequest
0 голосов
/ 22 января 2020

Это код моего потокового компоновщика.

    StreamBuilder<RatesData>(
          stream: DatabaseRatesService(fid: fid).ratesData,
          builder: (context, snapshot) {
            if (!snapshot.hasData) // Doesn't get off from this condition and keeps loading.
              return LoadingLogin(); // A simple loading widget
            RatesData ratesData = snapshot.data;
              print(ratesData.fid);
              return Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Container(
                    height: 50,
                    child: Text(
                      ratesData.fid,
                      style: TextStyle(color: Colors.black),
                    ),
                  ),
                ],
              );
            }
)

И это класс, в котором у меня есть все запросы к базе данных. Кажется, я успешно получил данные из firebase, но они не отображаются в моем потоковом компоновщике. Я подозреваю, что данные не внедряются в модель данных, которую я создал, но понятия не имею, как.

class DatabaseRatesService{

  final String fid;
  DatabaseRatesService({this.fid});

DocumentReference get(){
  return Firestore.instance.collection('rates').document(fid);}

  RatesData _ratesDataFromSnapshot(DocumentSnapshot snapshot){
    print(snapshot.data); // I put this here for testing purposes / it returns correct data here
    return RatesData(
      firstHourWeekday: snapshot.data['FirstHourWeekday'],
      firstHourWeekend: snapshot.data['FirstHourWeekend'],
      fid: fid,
      ratesWeekday: snapshot.data['RatesWeekday'],
      ratesWeekend: snapshot.data['RatesWeekend'],
      );
  }
  Stream<RatesData> get ratesData {
    DocumentReference ratesDocument = get();
    return ratesDocument.snapshots()
    .map(
      _ratesDataFromSnapshot
      );
  }

}

ОБНОВЛЕНИЕ: Не возвращалось ноль. Я попытался получить сообщение об ошибке. В сообщении говорится, что «тип« Список »не является подтипом типа« Список ».

Ответы [ 2 ]

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

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

snapshot.data['field'].cast<String>().toList() ?? List() // handle the null case as well with empty list    
0 голосов
/ 22 января 2020

есть проблема форматирования, вы пропускаете фигурные скобки {}, если оператор try ниже

if (! Snapshot.hasData) // Не выходит из этого условия и продолжает загружаться. {return LoadingLogin ();}

...