У меня есть API, который извлекает разбитые на страницы данные для каждого запроса, в данном случае 24 результата. Я работаю с StreamBuilder, Blo c и ReplaySubject для обработки пользовательского интерфейса.
Естественно, с отложенной загрузкой данных, я хочу иметь возможность сохранить предыдущие данные, которые были запрошены из API, тогда, когда я делаю новый запрос, просто на новые данные на старые данные, которые уже были отображены.
В настоящий момент, как и ожидалось, когда я использую метод stream.sink.add(user)
, пользовательский интерфейс обновляет 24 результата с новыми данные. Как сохранить старые данные в построителе потоков? С темой воспроизведения у меня есть доступ к предыдущим записям в потоке, используя _subject.values
, но я не хочу манипулировать этими данными и добавлять их в приемник потока, потому что это создаст проблемы, когда я переберу это.
Я видел примеры, в которых я могу слушать наблюдаемое в слушателе и обновлять состояние в функции инициализации состояния в виджете, но я хочу иметь возможность обрабатывать все результаты и объединять их все в Blo c, затем pu sh эти данные в виджет пользовательского интерфейса
Код ниже:
Blo c Класс
class ConnectBloc {
final ConnectNetwork api = ConnectNetwork();
ReplaySubject<List<UserModel>> _subject = ReplaySubject();
Observable<List<UserModel>> get stream => _subject.stream;
ConnectBloc({int pageNumber}) {
Observable<List<UserModel>> data =
Observable.fromFuture(api.getUsers(pageNumber));
_subject.addStream(data);
}
Future<List<UserModel>> loadUsers(pageNumber) async {
List<UserModel> user = await api.getUsers(pageNumber);
return user;
}
Future<bool> addUsersToList(int pageNumber) async {
// List<List<UserModel>> oldUserEntries = _subject.values;
// List<UserModel> userList =
// new List.from(oldUserEntries.expand((i) => i).toList());
final List<UserModel> nextPageUsers = await loadUsers(pageNumber);
// nextPageUsers.addAll(nextPageUsers);
if (nextPageUsers.isNotEmpty) {
_subject.sink.add(nextPageUsers);
return true;
}
return false;
}
void dispose() {
_subject.close();
}
}
Функция построения виджета:
@override
Widget build(BuildContext context) {
super.build(context);
return StreamBuilder<List<UserModel>>(
stream: bloc.stream,
builder: (BuildContext context, AsyncSnapshot<List<UserModel>> snapshot) {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Backdrop(
frontLayer: BackdropFrontPanel(
renderWidget: PeopleListing(
controller: _controller,
isLoading: this.isLoading,
snapshot: snapshot,
)),
backLayer: Backlayer(
heading: 'Connect with people',
filterGroup: filters,
handleFilterToggle: _handleFiltersToggle,
toggleFrontPanel: frontPanelVisible,
toggleFilter: _toggleActiveFilter,
),
panelVisible: frontPanelVisible,
frontPanelOpenHeight: 0,
frontHeaderHeight: 18.0,
frontHeaderVisibleClosed: true,
);
});
},
);
Итак, в итоге, каждый раз, когда я вызываю функцию addUsersToList()
из виджета пользовательского интерфейса, я хочу сохранить старые данные и по-прежнему отображать их в StreamBuilder
вместе с новыми данными, которые только что был загружен. Изо всех сил пытаться выяснить, как.
Заранее спасибо
Сэм