【问题标题】:Streambuilder snapshot.hasData never gets true although there is data in snapshot尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真
【发布时间】: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;
  • 是的,谢谢,就是这样

标签: flutter dart google-cloud-firestore snapshot stream-builder


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2020-04-16
  • 2020-07-02
  • 2022-11-19
  • 1970-01-01
  • 2021-07-01
  • 2013-11-15
  • 2023-02-11
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多