Я новичок в 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
.
Я немного растерялся.
Спасибо за ваше время.