使用 flutter bloc 控制小部件
Controll widget with flutter bloc
项目
嗨,
我最近发现了 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]);
....
}
我试图避免为每个可能的标题建立不同的状态,那将是一团糟
谢谢
您可以尝试在 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]);
....
项目
嗨, 我最近发现了 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]);
....
}
我试图避免为每个可能的标题建立不同的状态,那将是一团糟
谢谢
您可以尝试在 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]);
....