尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真

Posted

技术标签:

【中文标题】尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真【英文标题】:Streambuilder snapshot.hasData never gets true although there is data in snapshot 【发布时间】:2021-11-20 10:13:43 【问题描述】:

在我的应用程序中,我想从 Firestore 获取数据并在屏幕上显示快照。因此,我正在使用 Streambuilder,一旦加载数据,我就想显示它。

这是我的 Firebase 服务类:

class FireBaseHandler 
  final CollectionReference usersCol = FirebaseFirestore.instance.collection(
      'users');
  final myUser = FirebaseAuth.instance.currentUser;

  /// get user plan doc stream
  Stream<UserPlan> get userPlan 
    return usersCol.doc(myUser.uid).collection('plans').doc('plana')
        .snapshots().map(_userPlanFromSnapshot);
  

  /// userPlan from snapshot
  UserPlan _userPlanFromSnapshot(DocumentSnapshot snapshot) 
    print(snapshot.data());  /// here is data available
    return UserPlan(
      planId: 'plana',
      name: (snapshot.data() as Map)['name'],
      exerciseName: (snapshot.data() as Map)['exerciseName'],
      rows: (snapshot.data() as Map)['rows'],
    );
  


现在我想用 streambuilder 在屏幕上显示数据:

body: StreamBuilder<UserPlan>(
          stream: FireBaseHandler().userPlan,
          builder: (context, snapshot) 
            if (snapshot.hasData) 
              UserPlan userPlan = snapshot.data;
              return ListView(
                children: [
                  ListTile(
                    title: Text(userPlan.name),
                    onTap: () 
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) 
                            return ExerciseTable(title: userPlan.name, exerciseNumber: userPlan.exerciseName.length);
                          ,
                        ),
                      );
                    
                  )
                ],
              );
             else 
              return Center(child: CircularProgressIndicator(),);
            
          )

问题是snapshot.hasData 永远不会成为真的,我被困在加载屏幕中。但是当我打印快照时,有可用的数据,为什么snapshot.hasData 没有得到真实的结果?

【问题讨论】:

if (snapshot.hasData) 之前添加print(snapshot) - 您在日志中看到了什么? AsyncSnapshot(ConnectionState.waiting, null, null, null) 我也得到了这一行:AsyncSnapshot(ConnectionState.active, null, type 'List' is not a subtype of type 'List>' 所以你有 snapshot.hasError == true 并且错误是:"List 不是 List>" 类型的子类型 - 你应该改变.snapshots().map.snapshots().map&lt;UserPlan&gt; 是的,谢谢,就是这样 【参考方案1】:

将此作为社区 wiki 发布,因为这是基于 @Pskink 提供的 cmets:

由于对快照映射类型的转换处理不当而发生此错误,您可以通过在创建流时将 .snapshots().map() 更改为 .snapshots().map&lt;UserPlan&gt;() 来修复它。

【讨论】:

你好@Dalon。如果可以解决您的问题,请考虑 accepting the answer。

以上是关于尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:StreamBuilder 快照——无数据

Flutter:将firestore快照转换为streambuilder中的列表

Flutter StreamBuilder中使用的Firestore快照在数据更改时永远不会更新

在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行

来自一个 StreamBuilder 的 Flutter 快照显示在另一个 StreamBuilder 中

StreamBuilder 为每次更新构建两次快照