Как объединить несколько потоков внутри потока - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь использовать панель вкладок и вид панели вкладок, чтобы отобразить некоторые элементы базы огня. Сначала я использовал построитель потоков, чтобы получить текст вкладок на панели вкладок:

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», в котором есть документы, каждый идентификатор документа представляет идентификатор документа в другой коллекции с именем «users». В каждом документе пользователей у меня есть поле с именем place. Я уже сделал вкладки, и это работает, но, что я не могу сделать, это: хочу получить идентификатор документа каждого документа в коллекции времен, и получить этот идентификатор документа и использовать его для доступа к документам, имеющим тот же идентификатор в коллекции «пользователи», и проверить, имеет ли поле места одинаковое значение имени на вкладке Бар, я хочу показать его в представлении панели вкладок! Как я могу это сделать? извините за путаницу, но я новичок в использовании потоков и FireStore, поэтому я не знаю, что делать! Пожалуйста, помогите

1 Ответ

0 голосов
/ 29 октября 2018

Если я правильно понял, одним из решений было бы создание StatefulWidget внутри его State с использованием локального StreamController и указание на него StreamBuilder.

Отдельно используйте оба потока и добавьте эти элементы в свой 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.

...