Получатель «документ» был вызван на нуль. Поток <QuerySnapshots>документов не возвращается - PullRequest
0 голосов
/ 04 мая 2020

Определено Stream<QuerySnapshot>, я вызываю uid из конструктора класса

Stream<QuerySnapshot> get hotels {
    // print("$uid in stream");

    return ownerCollection.document(uid).collection("hotels").snapshots();
  }

Установка StreamProvider

class Hotels extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    return StreamProvider<QuerySnapshot>.value(
      value: DatabaseService(uid: user.uid).hotels,
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.orangeAccent,
          title: Text("My Hotels"),
        ),
        body: HotelList())
      );

Вот мой экран, который обращается к Stream<QuerySnapshot>

class HotelList extends StatefulWidget {
  @override
  _HotelListState createState() => _HotelListState();
}

class _HotelListState extends State<HotelList> {
  @override
  Widget build(BuildContext context) {

    final hotels = Provider.of<QuerySnapshot>(context);

    for(var doc in hotels.documents) {
      print(doc.data);
    }

     return Container();
  }
}

Когда я запускаю его, мне выдается ошибка: The getter 'documents' was called on null , Reciever : null

Пожалуйста, помогите, я хочу напечатать все документы из подгруппы "hotels".

1 Ответ

0 голосов
/ 04 мая 2020

Как я уже сказал в комментарии, сообщение об ошибке «X был вызван на ноль» означает, что X - это не то, что является нулем, а то, что вы вызывали. В вашем случае это код проблемы:

final hotels = Provider.of<QuerySnapshot>(context);

for(var doc in hotels.documents) {
  print(doc.data);
}

Ошибка говорит о том, что documents вызывается по нулю, что означает, что hotel равно нулю. Это означает, что выборка вашего провайдера не работает должным образом.

Я не слишком много работал с StreamProvider, но если бы мне пришлось догадываться, это потому, что в первый раз, когда ваш виджет был собран, исходный поток не ' t еще не опубликовал никаких данных, что имеет смысл, поскольку источником потока является онлайн-сервис, которому требуется время для подключения и сбора данных. Это означает, что QuerySnapshot для возврата нет, и поэтому Provider.of возвращает ноль.

Обычно это можно исправить, указав StreamProvider начальное значение. Так как типом является QuerySnapshot, я не уверен, какое будет чувственное начальное значение, кроме нуля. В этом случае ваш единственный реальный вариант - просто обработать случай, когда hotel равен нулю.

final hotels = Provider.of<QuerySnapshot>(context);

if (hotels == null) {
  print('There is no data yet.');
  return Container();
}

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...