В моем приложении Flutter есть несколько блоков BloC (через пакеты bloc и flutter_bloc), что вызвало некоторые технические трудности, которые я решил с помощью обходного пути, но мне было интересно, есть ли лучший решение там.
Я использую BlocBuilder () при прослушивании блока, где каждый блок имеет свой собственный вызов BlocBuilder (). Сначала я вкладывал вызовы BlocBuilder () следующим образом:
Widget build(BuildContext context) {
return BlocBuilder (
bloc: bloc1,
builder: (ctx, snapshot1) {
do_something1(snapshot1);
return BlocBuilder(ctx2, snapshot2) {
bloc: bloc2,
builder: (ctx2, snapshot2) {
do_something2(snapshot2);
return renderWidget();
}
}
}
);
}
Проблема, с которой я сталкиваюсь с этими вложенными вызовами BlocBuilder (), заключается в том, что если данные поступают для bloc1, BlocBuilder () для bloc2 будет повторно вызван, в результате чего текущее состояние для bloc2 будет повторно прочитано () и возникнут трудности для do_something2. (), который в идеале должен вызываться только при наличии новых данных для bloc2.
Итак, я создал отдельный виджет для каждого вызова BlocBuilder (), в результате получился следующий новый build ():
Widget build(BuildContext context) {
return Column(
children: [
WidgetBlocBuilder1(),
WidgetBlocBuilder2(),
renderWidget(),
],
);
}
Это означает, что любые данные, поступающие для bloc1 или bloc2, будут локализованы в WidgetBlocBuilder1 () или WidgetBlocBuilder2 () соответственно и, что более важно, входящие данные блока НЕ будут вызывать повторный вызов BlocBuilder () для другого блока ( ), как это было в моем вложенном подходе BlocBuilder ().
Вот build () для WidgetBlocBuilder1 ():
Widget build(BuildContext context) {
return BlocBuilder(
bloc: bloc,
builder: (ctx, snapshot) {
if (snapshot is CommandEditorSaveFile) {
_saveDocumentFile(ctx);
}
return Visibility(
child: Text('test'),
visible: false,
);
},
);
}
Обратите внимание, что WidgetBlocBuilder1 () является невидимым виджетом, как показано оболочкой Visibility (visible: false). Это потому, что сам виджет не должен ничего отображать на экране; виджет - это просто оболочка для вызова BlocBuilder (). Если входящие данные блока должны изменить видимое состояние родительского виджета, тогда необходимо написать логику для реализации этого.
Этот обходной путь, кажется, работает, но мне было интересно, есть ли лучшее решение.
Любые предложения будут ценны.
/ Joselito
StreamBuilder
вместо двухBlocBuilder
? - person pskink   schedule 04.07.2021Bloc
, и вы показываете объединенные данные, используя одинStreamBuilder
- person pskink   schedule 04.07.2021