带有控件组的控件

时间:2019-11-07 03:08:17

标签: 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]);
....
}

我正在努力避免为每个可能的标题建立不同的状态,那将是一团糟

谢谢

1 个答案:

答案 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]);
....