【问题标题】:Snapshot from StreamBuilder来自 StreamBuilder 的快照
【发布时间】:2021-10-21 23:53:44
【问题描述】:

我正在使用来自 Cloud Firestore 的数据在 Streambuilder 内处理 ListView。 这里有代码:

//inicio stream
                                              StreamBuilder<List<Evento>>(
                                                  stream: eventosProvider
                                                      .eventosbares,
                                                  builder: (context, snapshot) {
                                                    if (snapshot
                                                        .data.isNotEmpty) {
                                                      return SizedBox(
                                                        height: 155,
                                                        child: ListView.builder(
                                                            scrollDirection:
                                                                Axis.horizontal,
                                                            itemCount: snapshot
                                                                .data.length,
                                                            itemBuilder:
                                                                (context,
                                                                    index) {
                                                              var dateString =
                                                                  snapshot
                                                                      .data[
                                                                          index]
                                                                      .fechaEvento;
                                                              var date = DateFormat(
                                                                      'd-M-yyyy HH:mm',
                                                                      'de_DE')
                                                                  .parse(
                                                                      dateString);

                                                              return Card(
                                                                shape:
                                                                    RoundedRectangleBorder(
                                                                  borderRadius:
                                                                      BorderRadius
                                                                          .circular(
                                                                              10),
                                                                ),
                                                                child:
                                                                    Container(
                                                                  height: 178,
                                                                  width: 280,
                                                                  child: Column(
                                                                      children: [
                                                                        Padding(
                                                                          padding: const EdgeInsets.only(
                                                                              left: 8.0,
                                                                              right: 8.0,
                                                                              top: 8.0),
                                                                          child:
                                                                              ClipRRect(
                                                                            borderRadius:
                                                                                BorderRadius.circular(8),
                                                                            child:
                                                                                Image.network(
                                                                              snapshot.data[index].imagenEvento,
                                                                              width: 278.0,
                                                                              height: 80.0,
                                                                              fit: BoxFit.fill,
                                                                            ),
                                                                          ),
                                                                        ),
                                                                        Padding(
                                                                          padding:
                                                                              const EdgeInsets.all(8.0),
                                                                          child:
                                                                              Row(
                                                                            mainAxisAlignment:
                                                                                MainAxisAlignment.start,
                                                                            children: [
                                                                              CircleAvatar(
                                                                                radius: 20.0,
                                                                                backgroundImage: NetworkImage(snapshot.data[index].fotoPerfilAutor),
                                                                                backgroundColor: Colors.transparent,
                                                                              ),
                                                                              Padding(
                                                                                padding: const EdgeInsets.all(2.0),
                                                                                child: Container(
                                                                                  width: 150,
                                                                                  child: Column(
                                                                                    crossAxisAlignment: CrossAxisAlignment.start,
                                                                                    children: [
                                                                                      Text(
                                                                                        snapshot.data[index].tituloEvento,
                                                                                        overflow: TextOverflow.ellipsis,
                                                                                        style: TextStyle(
                                                                                          fontWeight: FontWeight.bold,
                                                                                          fontSize: 13,
                                                                                        ),
                                                                                      ),
                                                                                      Text(
                                                                                        DateFormat('EEEEE dd MMM yyyy   HH:mm', 'es_ES').format(date),
                                                                                        style: TextStyle(fontSize: 10),
                                                                                      ),
                                                                                    ],
                                                                                  ),
                                                                                ),
                                                                              ),
                                                                              SizedBox(
                                                                                width: 10,
                                                                              ),
                                                                              Text(
                                                                                snapshot.data[index].num_invitados,
                                                                                style: TextStyle(color: ColoresApp.naranjaTop, fontWeight: FontWeight.bold, fontSize: 14),
                                                                              ),
                                                                              SizedBox(
                                                                                width: 5,
                                                                              ),
                                                                              CircleAvatar(
                                                                                radius: 10.0,
                                                                                backgroundImage: AssetImage("assets/friends.png"),
                                                                                backgroundColor: Colors.transparent,
                                                                              )
                                                                            ],
                                                                          ),
                                                                        ),
                                                                      ]),
                                                                ),
                                                              );
                                                            }),
                                                      );
                                                    } else {
                                                      return Text(
                                                        "No hay eventos en bares",
                                                        style: TextStyle(
                                                            color:
                                                                Colors.white),
                                                      );
                                                    }
                                                  }),

使用此代码我得到以下异常,应用程序没有退出,它只显示红色错误背景片刻,但这是不可接受的:

======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building StreamBuilder<List<Evento>>(dirty, state: _StreamBuilderBaseState<List<Evento>, AsyncSnapshot<List<Evento>>>#d6fd3):
The getter 'isNotEmpty' was called on null.
Receiver: null
Tried calling: isNotEmpty

我尝试过换行:

if (snapshot.data.isNotEmpty)

if (snaphot.hasData)

然后,异常消失了,但是抛出了一个空格,而不是 if 子句的 else 部分。

我应该怎么做才能知道 snapshop 是否有真正的数据或正在等待获取它们?

编辑

这里有加载 Stream 的服务:

Stream<List<Evento>> getEventosBares(){


    return _db
        .collection('eventos').where('interes', isEqualTo: 'bares')
        .snapshots()
        .map((snapshot) => snapshot.docs
        .map((doc) => Evento.fromJson(doc.data()))
        .toList());
  }

这里有提供者:

Stream<List<Evento>> get eventosbares => firestoreService.getEventosBares();

【问题讨论】:

  • 我认为您在 eventosProvider.eventosbares 的流有问题。尝试删除 else 关键字并在 if 块之后返回文本小部件并查看结果。该错误表示您调用它的提供者没有 eventosbares。检查一下。
  • @Benyamin,我的问题中包含了流的来源。

标签: flutter dart google-cloud-firestore


【解决方案1】:

尝试添加空检查:

builder: (context, snapshot) {
 if (snapshot.data != null && snapshot.data.isNotEmpty) {
   return SizedBox(...);

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 2019-09-19
    • 2021-08-08
    • 2019-07-23
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 2021-09-30
    相关资源
    最近更新 更多