如何使用 Future Builder 创建包含来自 Cloud FireStore 的数据的列表

Posted

技术标签:

【中文标题】如何使用 Future Builder 创建包含来自 Cloud FireStore 的数据的列表【英文标题】:How can I create a list with data from Cloud FireStore using Future Builder 【发布时间】:2020-09-23 16:03:33 【问题描述】:

我正在尝试使用从 Cloud Firestore 检索数据的列表视图创建 Flutter 应用程序。我遇到了 Future Builder 的问题。在下面找到我的代码:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:awesome_loader/awesome_loader.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

void main() => runApp(OfferPage());

class OfferPage extends StatefulWidget 
@override
_OfferPageState createState() => _OfferPageState();


class _OfferPageState extends State<OfferPage> 
@override
Widget build(BuildContext context) 
return MaterialApp(
    debugShowCheckedModeBanner: false,
    theme: ThemeData(primaryColor: Colors.green[900]),
    home: Scaffold(
      appBar: AppBar(
        title: Text('Click a Deal'),
        centerTitle: true,
        backgroundColor: Colors.green[900],
      ),
      body: OfferScroll(),
    ));
    
     

    class OfferScroll extends StatefulWidget 
    @override
    _OfferScrollState createState() => _OfferScrollState();
     

    class _OfferScrollState extends State<OfferScroll> 

     Future getOffers() async 
     var firestore = Firestore.instance;
     QuerySnapshot qn = await firestore.collection("Offers").getDocuments();
     return qn.documents;
    

    @override
    Widget build(BuildContext context) 
       return Container(
          child: FutureBuilder(
          future: getOffers(),
          builder: (_, snapshot) 
          if (snapshot.connectionState == ConnectionState.waiting) 
              return Center(
                 child: AwesomeLoader(
                 loaderType: AwesomeLoader.AwesomeLoader3,
                 color: Colors.green[900],
            ),
          );
         else 
          ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (_, index) 
                return ListTile(
                    title: Text(snapshot.data[index].data["title"]));
              );
        
      ),
);


我遇到了这个错误:

在构建 FutureBuilder(dirty, state: _FutureBuilderState#ea2bc) 时抛出了以下断言: 构建函数返回 null。

有问题的小部件是:FutureBuilder 构建函数绝不能返回 null。

要返回导致建筑小部件填满可用空间的空白空间,请返回“Container()”。要返回占用尽可能少空间的空白空间,请返回“Container(width: 0.0, height: 0.0)”。

【问题讨论】:

【参考方案1】:

必须在ListView.builder前添加return,否则else分支会返回null:

return ListView.builder(
    itemCount: snapshot.data.length,
    itemBuilder: (_, index) 
        return ListTile(
            title: Text(snapshot.data[index].data["title"]));
    ,
);

【讨论】:

谢谢@MarcelGeirhos,只是忘了补充。编程新手 不是您的问题的正确解决方案?当它是正确的解决方案时,请接受答案。 :) 能否请您查看我的其他帖子,我需要它工作:***.com/q/62208497/10616816 我认为您应该寻找 NetworkImage 来加载图像,然后您可以参考您要显示的图像 url。 当您在 FireStore 中将 URL 作为字符串时,我认为您可以通过以下方式检索 URL:snapshot.data[index].data['imageFieldName'] 然后您可以提供将此(URL)返回到 NetworkImage 以显示图像。

以上是关于如何使用 Future Builder 创建包含来自 Cloud FireStore 的数据的列表的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Future.Builder 中的快照从不出错?

REST GET 在 Future Builder 中返回无效参数

如何为 ListView.builder 加载数据以从提供者的数据构建

Flutter 'map' 动态调用 null。接收方:'_Future<dynamic>' 的实例 参数:['(dynamic) => Builder' 的实例]

无法在Future Builder中显示解析的JSON

Flutter + Hive 检查 Future Builder 的框中是不是存在值