使用 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]);
....