【问题标题】:How add/fetch data from firestore using StreamBuilder<QuerySnapshot> in flutter?如何在 Flutter 中使用 StreamBuilder<QuerySnapshot> 从 firestore 添加/获取数据?
【发布时间】:2019-02-24 03:58:05
【问题描述】:

我想在我的 Firestore 中添加数据,例如

->users(collection)->userid(document)->friends(collection)

我想从好友集合中添加/获取数据

这是我的代码:

 Future<void> _getUserDoc() async {
    final FirebaseAuth _auth = FirebaseAuth.instance;
    final Firestore _firestore = Firestore.instance;

    FirebaseUser user = await _auth.currentUser();
    DocumentReference ref = _firestore.collection('users').document(user.uid);
 }


Widget _buildBody(BuildContext context) {
  return StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance
        .collection('users')
        .document()
        .collection('friends')
        .snapshots(),
    builder: (context, snapshot) {
      if (!snapshot.hasData)
        return Center(
            child: CircularProgressIndicator(
          backgroundColor: Colors.deepPurple,
        ));

      return _buildList(context, snapshot.data.documents);
    },
  );
}

在小部件 _buildbody 中我如何使用 user.uid 来获取好友集合中的数据。

提前致谢

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    如果您的小部件是有状态的小部件,那么您可以在小部件的状态下拥有用户文档引用,并使用相同的引用来获取朋友集合数据,例如:

     DocumentReference userRef;
     @override
     initState(){ 
      super.initState();
      _getUserDoc();
     } 
    
     //Call this method from initState()
     Future<void> _getUserDoc() async {
        final FirebaseAuth _auth = FirebaseAuth.instance;
        final Firestore _firestore = Firestore.instance;
    
        FirebaseUser user = await _auth.currentUser();
        setState((){
          userRef = _firestore.collection('users').document(user.uid);
        });
     }
    
    
    Widget _buildBody(BuildContext context) {
      if(userRef == null) {
      CircularProgressIndicator(
              backgroundColor: Colors.deepPurple,
            ));
      }
    
      return StreamBuilder<QuerySnapshot>(
            stream: userRef
            .collection('friends')
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData)
            return Center(
                child: CircularProgressIndicator(
              backgroundColor: Colors.deepPurple,
            ));
    
          return _buildList(context, snapshot.data.documents);
        },
      );
    }
    

    附: : 只需确保在调用 StreamBuilder 函数“_buildBody”之前 userRef 不为空

    【讨论】:

    • 在 getuserDoc() 中,userRef 显示错误 - Undefined name 'userRef'.dart(undefined_identifier)
    • 类 _FirstLeaderState 扩展状态 { DocumentReference userRef; @override initState() { super.initState(); _getUserDoc(); }
    • 哦..您是否尝试过热重启而不是热重载。我的意思是,如果您从终端运行,请尝试输入“R”而不是“r”来重新加载应用程序。作为已经构建的小部件,添加新的状态变量不会被识别为状态方法已经被调用并且不会被调用以进行热重载,您能否确认即使热重启也存在错误。谢谢。
    • 我重建了应用程序。屏幕上的错误是 -> NoSuchMethodError : 方法 'collection' 为空。接收方:空。尝试调用:collection()
    • 是的,正如我在 P.S. 中提到的那样。注释,在构建 streamBuilder 之前检查“userRef”是否为空。 :)。尝试在方法“_buildBody”的开头返回 CircularProgressIndicator 直到 userRef 为空,我也错过了一件事,userRef = _firestore.collection('users').document(user.uid);在 setState 调用中,我会更正我的建议以帮助您更好地理解
    猜你喜欢
    • 2020-03-04
    • 2020-07-30
    • 1970-01-01
    • 2021-10-22
    • 2023-01-01
    • 1970-01-01
    • 2021-10-03
    • 2020-08-08
    • 2021-02-20
    相关资源
    最近更新 更多