Как получить выходной поток Observable с объединениемПоследний в Flutter - PullRequest
0 голосов
/ 04 апреля 2020

В моей базе данных Firecloud у меня есть две коллекции: 'users' и 'sites'
обзор пользователя (1) , обзор пользователя (2) ,
обзор сайтов (1) , обзор сайтов (2)

В дереве виджетов я могу отображать поток пользователей или сайтов , но мне нужно объединить их в один поток и отобразить их с помощью Streambuilder в моем дереве виджетов. Я создал класс EntriesBlo c, который использует Observables с combLates2:

class EntriesBloc {
  EntriesBloc({@required this.database});
  final Database database;

  // combine streams
  Stream<List<Combine>> get _allEntriesStream => Observable.combineLatest2(
        database.sitesStream(),
        database.usersStream(),
        _entriesCombiner,
      );

  static List<Combine> _entriesCombiner(List<Site> sites, List<Users> users) {
    return sites.map((site) {
      final user = users.firstWhere((user) => user.uid == site.uid);
      return Combine(site, user);
    }).toList();
  }
}

объединенный класс:

class Combine {
  final Site site;
  final Users user;

  Combine(this.site, this.user);
}

С одним потоком я бы просто перечислил его так в дерево виджетов:

 StreamBuilder<List<Users>>(
                stream: database.usersStream(),
                builder: (context, snapshot) { ... }

и то же самое для коллекции сайтов.

Но как мне это сделать с Observable? Причина, по которой я хочу объединить два потока, заключается в том, что я хотел бы отобразить всех «работников» с данного сайта в «сайтах», а затем иметь возможность показать более подробную информацию о работниках, которая находится в коллекции «пользователей». .

Вот мои модели для пользователей и сайта:

class Users {
  Users({@required this.uid, @required this.address, @required this.firstName, @required this.lastName});
  final String uid;
  final String address;
  final String firstName;
  final String lastName;

  factory Users.fromMap(Map<String, dynamic> data, String uid) {
    if(data == null){
      print('error in site.dart: Site.frommap (data is null)');
      return null;
    }
    final String address = data['address'];
    final String firstName = data['first_name'];
    final String lastName = data['last_name'];

    return Users(
        uid: uid,
      address: address,
      firstName: firstName,
      lastName: lastName
    );
  }

  Map<String, dynamic> toMap(){
    return {
      'uid' : uid,
      'address': address,
      'first_name': firstName,
      'last_name': lastName
    };
  }
}
class Site {
  Site({@required this.siteId, @required this.address, @required this.owner, this.workers});
  final String siteId;
  final String address;
  final String owner;
  final List workers;


  factory Site.fromMap(Map<String, dynamic> data, String documentId) {
    if(data == null){
      print('error in site.dart: Site.frommap (data is null)');
      return null;
    }
    final String address = data['address'];
    final String owner = data['owner'];
    final List workee = data['workerId'];

    return Site(
      siteId: documentId,
      address: address,
      owner: owner,
      workers: workee
    );
  }

  Map<String, dynamic> toMap(){
    return {
      'address': address,
      'owner': owner,
      'workerId': workers
    };
  }
}
...