StreamBuilder 未显示来自 firestore 的数据

Posted

技术标签:

【中文标题】StreamBuilder 未显示来自 firestore 的数据【英文标题】:StreamBuilder is not showing data from firestore 【发布时间】:2021-07-26 07:23:11 【问题描述】:

我正在使用 streambuilder 来显示快照数据,但它没有显示。屏幕只是空白,但是当我使用带有 get() 方法的未来构建器时,它会显示数据,但我想要实时更改。我是新手,请帮我解决这个问题。这是代码。

class TalentScreen2 extends StatelessWidget 
  final Query _fetchFavUser = FirebaseRepo.instance.fetchFavUsers();

  @override
  Widget build(BuildContext context) 
    return SafeArea(
      child: Scaffold(
        body: Column(
          children: [
            Text('Talent Screen 2(Favourites)'),
            Expanded(child: _retrieveData(context))
          ],
        ),
      ),
    );
  

  Widget _retrieveData(BuildContext context) => StreamBuilder<QuerySnapshot>(
      stream: _fetchFavUser.snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) 
        if (snapshot.hasError) return const Text('Something went wrong');
        if (!snapshot.hasData) return const Text('Alas! No data found');
        if (snapshot.connectionState == ConnectionState.waiting)
          return Center(
              child: CircularProgressIndicator(
            strokeWidth: 2.0,
          ));
        if (snapshot.connectionState == ConnectionState.done)
          return theUserInfo(snapshot.data.docs);

        return Container();
      );

  Widget theUserInfo(List<QueryDocumentSnapshot> data) 
    return ListView.builder(
        shrinkWrap: true,
        itemCount: data.length,
        itemBuilder: (BuildContext context, int index) 
          var uid = data[index]['uid'];
          TalentHireFavModel userData = TalentHireFavModel.fromMap(
            data[index].data(),
          );

          return Card(
            child: Column(
              children: <Widget>[
                Text(data[index]['orderBy']),
                //  Text(userData.name ?? ''),
                Text(userData.categories),
                Text(userData.skills),
                //   Text(userData.country ?? ''),
                Text(userData.phoneNo),
                Text(userData.hourlyRate),
                Text(userData.professionalOverview),
                Text(userData.skills),
                Text(userData.expert),
                //   Text(userData.createdAt ?? ''),
                _iconButton(userData.uid, context),
              ],
            ),
          );
        );
  

  Future<DocumentSnapshot> fetch(data) async =>
      await FirebaseRepo.instance.fetchWorkerUserData(data);

  Widget _iconButton(uid, context) 
    return IconButton(
        icon: Icon(Icons.favorite),
        onPressed: () 
          BlocProvider.of<TalentFavCubit>(context).removeTalentFav(uid);
        );
  

这里是 firestore 查询方法,我只是应用简单查询来获取所有文档并显示它们。我想要实时更改

Query fetchFavUsers() 
    var data = _firestore
        .collection('workerField')
        .doc(getCurrentUser().uid)
        .collection('favourites')
        //   .where('uid', isNotEqualTo: getCurrentUser().uid)
        .orderBy('orderBy', descending: true);
    return data;
  

【问题讨论】:

你看到加载指示器了吗?可以在_retrieveData 中添加打印以检查它是否被调用,并在return Container(); 之前添加打印以查看它是否仅返回空容器。 【参考方案1】:

解决方案是只返回函数。从 if 语句中取出该方法并将其放在 return 语句中。

【讨论】:

以上是关于StreamBuilder 未显示来自 firestore 的数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:显示来自经过身份验证的 Firebase Auth 用户的带有 StreamBuilder 的一些 Firestore 集合

在 Flutter 中使用 streamBuilder 时条件不起作用

在 StreamBuilder 中使用 SnackBar 的奇特方式是啥?

Flutter Firebase 实时数据库 StreamBuilder 更新

Flutter & firebase - StreamBuilder 未加载

解析来自 StreamBuilder C# 的 JSON 响应