Flutter:使用StreamProvider调用列表在显示数据之前返回null

时间:2020-07-06 05:42:33

标签: flutter dart stream flutter-provider

我正在尝试使用StreamProvider从Firebase集合中检索对象列表,并且正在检索这些对象,但是在一秒钟内,控制台会在屏幕上呈现数据之前用红色屏幕引发错误。 。这是显示的错误...

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之类的东西,或者在没有数据时返回某些东西,但是我将如何实现呢?

2 个答案:

答案 0 :(得分:0)

这是迄今为止我看过的最好的教程,请尝试查看。

Flutter & Firebase App Tutorial #20 - Listing Brew Data

答案 1 :(得分:0)

您应该将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,
          );
    }
  ),
),