Работа со списком <T>и разбитыми на страницы данными в Flutter blo c и ReplaySubject - PullRequest
0 голосов
/ 15 января 2020

У меня есть 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 вместе с новыми данными, которые только что был загружен. Изо всех сил пытаться выяснить, как.

Заранее спасибо

Сэм

...