Редактировать : вскоре после публикации я понял, что это полностью зависит от того, как данные предоставляются:
Если у вас есть метод, который имеет подпись, такую как Observable<String> getStringForInt(int number)
, и у вас естьчтобы позвонить по каждому пункту в списке, мое решение для вас. Примечание , если описанный выше метод всегда подписывается на один и тот же поток, изменение этого потока приведет к нескольким выбросам (так как combLatest обновляет каждый элемент).
Однако, если у вас есть доступ ко всем даннымКонтейнер (например, Карта
Оригинальный ответ
Хорошо, оказывается, достичь этого с помощью rxDart было не совсем возможно.
Конструктор combineLatest
поддерживает только до 9 потоков.
Но с тех пор было реализовано комбинирование последнего с n-потоками, и решение этой проблемы могло бы выглядеть примерно так:
Map<int, BehaviorSubject<String>> subject2 = {
1: BehaviorSubject<String>(seedValue: "Subject 1"),
2: BehaviorSubject<String>(seedValue: "Subject 2"),
3: BehaviorSubject<String>(seedValue: "Subject 3"),
4: BehaviorSubject<String>(seedValue: "Subject 4"),
5: BehaviorSubject<String>(seedValue: "Subject 5"),
};
void main() async {
Observable.fromIterable([1, 2, 3, 4, 5])
.toList().asObservable()
.flatMap((numbers) =>
Observable.combineLatest<String, List<String>>(numbers.map((index) => subject2[index]), (strings) => strings))
.listen((data) {
print("List of data incoming $data");
});
await Future.delayed(Duration(seconds: 2));
subject2[1].add("I'm 42 now");
}
Это напечатает:
List of data incoming [Subject 1, Subject 2, Subject 3, Subject 4, Subject 5]
List of data incoming [I'm 42 now, Subject 2, Subject 3, Subject 4, Subject 5]