首页 > 解决方案 > 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 的新手。

标签: 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的文档


推荐阅读