flutter - StreamBuilder 数据 == null
问题描述
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
return StreamBuilder<UserData>(
stream: DatabaseService(uid: user.uid).currentUserData,
builder: (context, snapshot) {
print(snapshot.data); // return null
数据库服务类
class DatabaseService {
final String uid;
DatabaseService({this.uid});
//collection reference
CollectionReference userCollection = Firestore.instance.collection('user');
//get user data stream
Stream<UserData> get currentUserData {
return userCollection.document(uid).snapshots().map(_userDataFromSnapshot);
}
//user data from snapshot
UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
return UserData(
uid: snapshot.data['uid'],
email: snapshot.data['email'],
fName: snapshot.data['first_name'],
lName: snapshot.data['last_name'],
mobileNumber: snapshot.data['mobile_number'],
gender: snapshot.data['gender'],
dob: snapshot.data['date_of_birth'],
);
}
}
我期望得到的数据是我调用的对象的实例。它返回flutter: null
。
当我在我的练习应用程序中尝试时,它会返回I/flutter (11395): Instance of 'UserData'
我不知道问题的根源在哪里,请帮忙。我是 Flutter 的新手。
解决方案
正如我们使用Streams
的那样,在小部件渲染时可能还没有获取任何数据。所以我们需要在尝试访问下面的数据之前检查流的状态
if (snapshot.hasError){
// access error using snapshot.error
}
else{
// check for stream state
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
case ConnectionState.active: // access snapshot.data in this case
case ConnectionState.done:
}
}
如需更多参考,您可以查看StreamBuilder的文档
推荐阅读
- jquery - 无法将从控制器传递到 thymeleaf html 的模型属性传递回另一个控制器
- javascript - 单击图像时如何隐藏图像并显示视频而不是它?使用 JavaScript
- css - CSS 溢出只滚动一个方向
- laravel - laravel Session::flush 不删除存储/框架/会话中的会话文件
- regex - 秒后的正则表达式捕获 /
- php - 构造函数内的属性值设置
- node.js - DocumentDB 连接问题
- angular - 从 RxJS5 更新到 RxJS6
- python - Sphinx 中的自定义部分编号
- typescript - Vuejs - 与 typecipt 模型类的两种方式绑定