Блок не может вернуть данные в диалоге - PullRequest
0 голосов
/ 07 апреля 2019

Я разрабатываю простое приложение todo, используя флаттер с шаблоном BloC.

У него есть пользовательский интерфейс для отображения TodoDetails.

Когда пользователь нажимает кнопку, он показывает новый SimpleDialog.

Я хочу показать какой-нибудь список тегов в SimpleDialog, например:

class AddEditTodoPage extends StatefulWidget {
  final TodoRepository todoRepository;
  final TagRepository tagRepository;
  final Todo todo;
  final SaveTodoBloc bloc;

  AddEditTodoPage({this.todoRepository, this.tagRepository, this.todo})
      : bloc = SaveTodoBloc(
            todoRepository: todoRepository,
            tagRepository: tagRepository,
            todo: todo);

  @override
  State<StatefulWidget> createState() => _AddEditTodoPageState(todo: todo);
}

class _AddEditTodoPageState extends State<AddEditTodoPage> {
  final Todo todo;
  _AddEditTodoPageState({this.todo});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: StreamBuilder<Tag>(
               stream: widget.bloc.tag,
               builder: (context, snapshot) {
                 final tag = snapshot.data;
                 return OutlineButton(
                     onPressed: () async {
                         final selectedTag = await showDialog<TagSelection>(
                           context: context,
                           builder: (context) => _showTagSelectDialog(context),
                         );
                     },
                 );
               }},
    );
  }

  _showTagSelectDialog(BuildContext context) => SimpleDialog(
        title: Text("Select a Tag or create a new one"),
        children: <Widget>[
          StreamBuilder<List<Tag>>(
              stream: widget.bloc.tags,
              builder: (context, snapshot) {
                final tagList = snapshot.data;
                if (tagList == null || tagList.isEmpty) {
                  // This is always 'null'!!!
                  return SizedBox();
                } else {
                  return ListView(
                    children: tagList.map(_buildTagName).toList(),
                  );
                }
              }),
        ],
      );

  Widget _buildTagName(Tag tag) => Text(tag.name);
}

Так что мой блок получает TagList вроде:

class SaveTodoBloc {

  final TodoRepository todoRepository;
  final TagRepository tagRepository;
  final Todo todo;

  SaveTodoBloc({this.todoRepository, this.tagRepository, this.todo}) {
    if (tagRepository != null) {
      _getTags();
    }
  }

  final _getTagsSubject = PublishSubject<List<Tag>>();

  Stream<List<Tag>> get tags => _getTagsSubject.stream;

  Future<Null> _getTags() async {
    await tagRepository.getAll().then((list) {
      _getTagsSubject.add(list);
      print("[SaveTodoBloc][JOS] _getTags - $list"); // It resturns correct list of Tags.
    });
  }

}

Когда я проверяю журнал,логика блока возвращает правильный список тегов.

Но когда я показываю диалог, у него нет списка тегов.Список нулевой.

...