Как BloC должен быть структурирован во Flutter? - PullRequest
0 голосов
/ 23 мая 2019

Я новичок в BloC и Flutter. Для одного простого экрана это должно работать без проблем. Но давайте посмотрим на мой случай, я запутался в том, как использовать шаблон BloC.

У меня есть один экран с именем Container, который содержит PageView из Content экрана. Скажем, у меня есть 5 страниц в этом PageView. Количество этих страниц является динамическим. Страницы отличаются только данными.

Я думаю о 2 способах реализации этого:

1 / Используя ОДИН одиночный блок и передайте его моему 5 ребенку Content.

2 / Использование одного блока для Container и другого блока для Content. Так что это похоже на вложенные блоки. ContainerBloc будет содержать список ContentBloc.

Для 1-го захода . Проблема, которую я вижу, это проблема повторного рендеринга. Я создам список данных каждой страницы:

List<List<String>> allData = [];
BehaviorSubject<List<List<String>>> _allData = BehaviorSubject<List<List<String>>>();

Observable<List<String>> getData(index) => _allData.stream.map((list) => list[index]); //This stream returns the list at the index

и каждая страница будет прослушивать данные по:

//StreamBuilder in the UI
stream: widget.bloc.getData(index);

и метод обновления данных должен быть таким:

void updateData(int index, List<String> newData) {
    List<String> temp = allData[index];
    temp.add(newData);
    allData[index] = temp;
    _allData.sink.add(allData);
}

Как я понимаю, однажды обновляется одна страница. Все остальные страницы будут перерисованы, потому что все они слушают поток getData(index), который будет запущен _allData.sink.add(allData); Поэтому я думаю, что все страницы будут перерисованы, даже если данные этой страницы не изменились.

Для 2-го подхода . Я не знаю, будет ли лучше иметь такой вложенный блок. Может быть, есть случай, когда ContainerBloc должен прослушать часть вывода ContentBloc.

Я немного растерялся.

Спасибо за ваше время.

...