Как я могу использовать Provider для предоставления blo c для PageView () без повторной подписки дочернего элемента каждый раз, когда я переключаю страницу? - PullRequest
0 голосов
/ 28 апреля 2020

Я использую Provider для предоставления своего blo c виджету с именем TheGroupPage с помощью метода c create

  static Widget create(BuildContext context, GroupModel group) {
    final database = Provider.of<DatabaseService>(context);
    return Provider(
      create: (_) => GroupMembersBloc(database, group),
      child: TheGroupPage(group),
      dispose: (BuildContext context, GroupMembersBloc bloc) => bloc.dispose(),
    );
  }

Этот виджет имеет PageView () с 3 страницами

  PageView(children: [
    TheGroupNotificationsView(),
    TheGroupMembersView(group),
    TheGroupSettingsView(group),
  ])

Представление членов группы ищет GroupMembersBlo c

GroupMembersBloc bloc = Provider.of<GroupMembersBloc>(context);

Я также пытался поставить прослушивание false, но это не сработало. И я хочу, чтобы виджет прослушивал любые изменения. Страница использует этот поток blo c для составления списка членов группы

class GroupMembersBloc{

  StreamController<List<UserModel>> _controller = StreamController<List<UserModel>>();
  Stream<List<UserModel>> get stream => _controller.stream;

  GroupMembersBloc(DatabaseService database, GroupModel group)
  {
   _controller.addStream(database.groupMembersStream(group));
  }

  void dispose(){
    _controller.close();
  }
}

Проблема в том, что когда я переключаю страницу внутри PageView (), я получаю сообщение об ошибке на странице после первого раза это было показано. Ошибка говорит Bad state: Stream has already been listened to. как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я закончил тем, что переместил StreamBuilder в родительский виджет над PageView (), что решило проблему.

0 голосов
/ 28 апреля 2020

Это потому, что контроллеры потока допускают только 1 подписку (или 1 прослушиватель), вы можете использовать конструктор [StreamController<List<UserModel>>.broadcast()][1] вместо StreamController> ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...