Управляющий виджет с блоком флаттера - PullRequest
0 голосов
/ 07 ноября 2019

Project

Привет, недавно я обнаружил блок флаттера, и теперь я пытаюсь понять, как именно это работает. Моя цель - отделить логику от классов виджетов, чтобы легко управлять своими проектами.

Проблема

Я застрял с чем-то очень простым, используя классический setState, но я пытался достичьэто с блоком.

Вот мой старый виджет

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 голосов
/ 07 ноября 2019

Вместо этого вы можете попробовать создать виджет заголовка в 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]);
....
...