如何在一个流中合并多个流

时间:2018-10-29 14:49:03

标签: firebase stream flutter

我正在尝试使用标签栏和标签栏视图显示火力基地的某些元素。首先,我使用流生成器在选项卡栏中获取选项卡的文本:

class HomePage extends StatelessWidget {
final FirebaseUser user;


  HomePage({this.user});

  @override
  Widget build(BuildContext context) {
    return new StreamBuilder<QuerySnapshot>(
    stream: Firestore.instance.collection("places").snapshots(),
    builder: (BuildContext context,AsyncSnapshot<QuerySnapshot> snapshot){
        if (!snapshot.hasData){
        return Center(child: CircularProgressIndicator());
      }
      else{
      return DefaultTabController(
      length: 20,
      child: Scaffold(
      appBar: AppBar(
         title: Text("Home Page"),
         bottom: TabBar( isScrollable: true,
              tabs: new List.generate(snapshot.data.documents.length, (index) {
                     return new Tab(child: Text(snapshot.data.documents[index]['name'].toString().toUpperCase()));
              }),)),

然后,我想从消防商店中获得一个名为“ temps”的流构建器,其中包含文档,每个文档ID代表另一个名为“ users”的集合中的文档ID。在用户的每个文档中,我都有一个名为place的字段。我已经制作了选项卡并且可以使用,但是,我不能做的是: 要获取集合临时中每个文档的文档ID,并获取此文档ID并使用它来访问“用户”集合中具有相同ID的文档,并检查字段中选项卡中名称的值是否相同酒吧,我想在标签栏视图中显示它! 我怎样才能做到这一点? 抱歉,我很困惑,但是我不熟悉使用流和Firestore,所以我不知道该怎么办! 请帮忙

1 个答案:

答案 0 :(得分:0)

如果我正确理解,一种解决方案是在StatefulWidget内使用本地State创建一个StreamController,并将您的StreamBuilder指向它。

分别使用两个Streams,并将这些项目添加到StreamController。

看起来有点像:

class YourClass extends StatefulWidget {
  ... createState() ...
}


class _YourClassState extends State<YourClass> {
  StreamController<YourItem> _places;

  @override
  void initState() {
    super.initState();

    // the unified stream
    _places = new StreamController();

    // listening to changes of the first reference
    CollectionReference places1Ref = Firestore.instance.collection("places1");
    places1Ref.listen((snapshopt) {
      // posting item to the unified streamController
      _places.add(item);
    });

    // listening to changes of the second reference
    CollectionReference places2Ref = Firestore.instance.collection("places2");
    places2Ref.listen((snapshopt) {
      // posting item to the unified streamController
      _places.add(item);
    });
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<YourItem>(
      stream: _places.stream, // using here only the unified stream
      builder: (context, snapshot) {
        return YourWidgets();
      }
    );
  }
}

此模型使用YourItem作为统一对象,但是您可以使用其他内容,包括dynamic本身。