嗨, 我最近发现了flutter bloc,现在我试图了解它的工作原理。我的目标是将逻辑与小部件类分开,以便轻松管理我的项目。
我坚持使用经典setState非常简单的方法,但是我试图通过bloc实现这一点。
这是我的一个旧小工具
Widget build(BuildContext context) {
return AnimatedOpacity(
duration: Duration(milliseconds: 200),
opacity: _opacity,
curve: Curves.easeInOut,
child: Text(
_currentTitle,
style: TitleTextStyle,
),
);
}
是否可以从集团控制_opacity和_currentTitle?像这样:
List<String> titles = ['title1', 'title2', ....];
int myIndex;
@override
Stream<SomeBlocState> mapEventToState(SomeEvent event,)
async* {
....
if (event is SomeSpecificEvent)
setWidgetTitle(titles[myIndex]);
....
}
我正在努力避免为每个可能的标题建立不同的状态,那将是一团糟
谢谢
答案 0 :(得分:0)
您可以尝试在StreamBuilder
中构建标题小部件。这将使您分清职责。这样BLoC不会知道任何状态更改或特定于小部件的事情。
Widget build(BuildContext context) {
return AnimatedOpacity(
duration: Duration(milliseconds: 200),
opacity: _opacity,
curve: Curves.easeInOut,
child: StreamBuilder<String>(
stream: myBloc.title,
builder: (_, snap) {
return Text(
snap?.data ?? 'Some default',
style: TitleTextStyle,
);
}
),
);
}
然后您在BLoC中创建一些逻辑,以根据需要发出标题
List<String> titles = ['title1', 'title2', ....];
int myIndex;
final _myObservableTitles = PublishSubject();
Stream<String> get title => _myObservableTitles.stream;
....
if (event is SomeSpecificEvent)
_myObservableTitles.add(titles[myIndex]);
....