В моей базе данных 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
};
}
}