Flutter Firestore查询以返回列表

时间:2018-11-22 04:44:07

标签: flutter google-cloud-firestore

我正在使用flutter和firebase构建类似程序的社交网络,并且当前需要查找以返回用户未关注的用户列表。

为了实现这一点,我试图生成用户正在关注的用户ID列表,然后循环浏览每个用户ID(可能会设置一个限制),并确定该ID是否在用户ID列表中用户未关注的信息。然后,我将为此返回小部件列表。

当前,我正在尝试调用当前关注者流,以返回用户当前关注的所有人的列表,但是Flutter不允许我从中返回列表吗?

class AddFollowers extends StatelessWidget {
  final String userId = 'userID imported here';

  Stream<List<String>> getFollowers(userId) async {
    final QuerySnapshot result = await Firestore.instance
        .collection('relationships')
        .document(userId)
        .collection('followers')
        .where("follower", isEqualTo: true)
        .getDocuments();
    final List<DocumentSnapshot> documents = result.documents;
    return documents;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        elevation: 0.0,
        leading: IconButton(
          icon: Icon(Icons.close),
          onPressed: () => Navigator.of(context).pop(),
        ),
        title: new Text("Find Your Following"),
      ),
      body: new Container(
        child: new StreamBuilder(
            stream: getFollowers(userId),
            builder:
                null //after returning the followers, I will build widgets of non-followers
            ),
      ),
//        new FindFollowerWidget(),
    );
  }
}

任何有关如何返回此结构或更好结构的建议都非常感谢。谢谢!

1 个答案:

答案 0 :(得分:0)

由于您使用的是 Stream,因此我假设您希望监听您的收藏和文档的实时更改。 FlutterFire 提供了 CollectionReferenceDocumentReference,它们都具有 snapshots() 方法,该方法返回您可以使用的 Stream。

对于您的用例,您可以像这样使用它:

// either set the collection as a Stream
Stream getCollectionStream(String userId){
  return FirebaseFirestore.instance
        .collection('relationships')
        .document(userId)
        .collection('followers')
        .where("follower", isEqualTo: true)
        .snapshots();
}

// or set it as a CollectionReference
CollectionReference getCollectionReference(String userId){
  // this returns a CollectionReference  
  return FirebaseFirestore.instance
        .collection('relationships')
        .document(userId)
        .collection('followers')
        .where("follower", isEqualTo: true);
}

并在您的 Widget build()

@override
Widget build(BuildContext context) {
  return new Scaffold(
    ...
    body: new Container(
      child: new StreamBuilder(
        // either this Stream snapshot
        stream: getCollectionStream(userId),
        // or use the reference with snapshots() method for the Stream
        // stream: getCollectionReference(userId).snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) {
            return Text('Something went wrong');
          }

          if (snapshot.connectionState == ConnectionState.waiting) {
            // display progressBar
            return Text("Loading");
          }
        ),
      },
    ),
  );
}

有关在 Cloud Firestore 上侦听实时更改的更多详细信息,请参阅此 guide