Flutter: вызов списка с помощью StreamProvider возвращает null перед отображением данных

Я пытаюсь получить список объектов из коллекции Firebase с помощью StreamProvider, и объекты извлекаются, но на долю секунды консоль выдает ошибку с красным экраном до того, как данные будут отображаться на экране. Это отображаемая ошибка ...

The getter 'length' was called on null.
Receiver: null
Tried calling: length

Это то, что у меня сейчас есть для кода ...

StreamProvider(create: (context) => _jobDb.getJobs(),),
Stream<List<Job>> getJobs() {
    return _api.streamDataCollection().map((snapshot) => snapshot.documents
        .map((document) => Job.fromJson(document.data))
        .toList());
  }
class ScrollableJobList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final jobs = Provider.of<List<Job>>(context);

    return ListView.builder(
      itemBuilder: (context, index) {
        Job job = jobs[index];
        return JobListTile(
          jobDetails: job,
        );
      },
      itemCount: jobs.length,
    );
  }
}

Так я что-то здесь упускаю? Я попытался использовать параметр начальных данных в StreamProvider, но это не сработало. Должен ли я сделать что-то асинхронное или использовать что-то вроде FutureBuilder или возвращать что-то, когда нет данных, но как я могу это реализовать?


person Jack Maring    schedule 06.07.2020    source источник
comment
Вы пытались проверить, являются ли данные пустыми или нулевыми, а затем вернуть список, иначе индикатор прогресса? Примерно так: return (jobs.isEmpty || jobs == null)? Центр (дочерний элемент: CircularProgressIndicator ()): ListView.builder ...   -  person Zolicious    schedule 06.07.2020
comment
Хорошо, спасибо, я попробовал jobs.isEmpty, но он разбился, потому что isEmpty не может не вызываться, когда он равен нулю. Хотя jobs == null работали!   -  person Jack Maring    schedule 06.07.2020


Ответы (2)


Это лучший учебник, который я когда-либо видел, попробуйте его проверить.

Flutter & # Firebase Noreferrer"> Листинг приложений Flutter & # Firebase

person Daniel Alexander    schedule 06.07.2020

Вам следует использовать виджет Consumer в паре с StreamProvider.

StreamProvider<List<Job>>(
  create: (context) => _jobDb.getJobs(),
  child: Consumer<List<Job>>(
    builder: (_, jobs, __) {
      return jobs == null ?
        CircularProgressIndicator() : 
        jobs.isEmpty ? 
          Text('No jobs') :
          ListView.builder(
            itemBuilder: (context, index) {
              Job job = jobs[index];
              return JobListTile(
                jobDetails: job,
              );
            },
            itemCount: jobs.length,
          );
    }
  ),
),
person BambinoUA    schedule 07.09.2020