Flutter BLoC-StreamSubscription无法在调度事件上侦听

时间:2019-10-22 10:52:50

标签: flutter bloc

我正在使用Flutter BLoC软件包来管理我的应用程序的状态,但是自从上次软件包更新(v0.22.1)以来,我的行为很奇怪。

简单来说,我在StreamSubscription中有一个PositionBloc状态的EventsBloc侦听器,但是当我从PositionBloc添加一个事件时,该侦听器不起作用。 最奇怪的是,我是第一次从EventsBloc添加事件,但监听器似乎完全被忽略了。

这是我的构建树:

main.dart:此处显示基于身份验证的主页或登录页面。 AuthenticationBlocMoviesBloc并不重要,或者LocalsBloc的重点是PositionBloc

class App extends StatelessWidget {
  ...
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      builder: (context) => MoviesBloc()..add(LoadMovies()),
      child: MaterialApp(
        home: BlocBuilder<AuthenticationBloc, AuthenticationState>(
          builder: (context, state) {
            if (state is Unauthenticated) {
              return Login(
                authenticationRepository: _authenticationRepository,
              );
            }
            if (state is Authenticated) {
              return MultiBlocProvider(
                providers: [
                  BlocProvider<LocalsBloc>(
                    builder: (context) => LocalsBloc()..add(LoadLocals()),
                  ),
                  BlocProvider<PositionBloc>(
                    builder: (context) => PositionBloc(
                      localsBloc: BlocProvider.of<LocalsBloc>(context),
                    ),
                  )
                ],
                child: Home(),
              );
            }
            return Splash();
          },
        ),
      ),
    );
  }
}

home.dart:这是用于管理StatefulWidget的{​​{1}},在这里我向小部件TabBarView提供了EventsBloc。在EventsCarousel小部件中,我有调度事件的触发器,因此根据所选位置重建SearchBar

EventsCarousel

class _HomeState extends State<Home> with SingleTickerProviderStateMixin { ... @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: TabBarView( children: <Widget>[ Stack( alignment: Alignment.topCenter, children: <Widget>[ BlocProvider<EventsBloc>( builder: (context) => EventsBloc(), child: EventsCarousel(), ), Positioned( child: SearchBar(), ), ], ), MoviesList(), Settings(), ], controller: _tabController, ), ), bottomNavigationBar: Material( child: TabBar( indicatorColor: Colors.deepOrange, tabs: <Tab>[ Tab( icon: Icon( FontAwesomeIcons.home ), ), Tab( icon: Icon( FontAwesomeIcons.bullhorn, ), ), Tab( icon: Icon( FontAwesomeIcons.cogs, ), ), ], controller: _tabController, ), ), ); } :这是用于管理search_bar.dartStatefulWidget的{​​{1}}。这里有我的应用程序状态更改器。我使用Flutter TypeAhead包来构建搜索栏,并且从main.dart中看到的_textController中提供了搜索栏的条目。当我点击条目时,会将事件_focusNode(本地)添加到LocalsBloc

UpdatePosition

我有用于事件和状态的标准Bloc样板,尤其是对于EventsBloc,正如我所说的我已订阅:

PositionBloc

在构建第一个小部件树之后,此侦听器不起作用,但是当我从搜索栏中的某个条目的选择中添加事件UpdatePosition时,PositionBloc的状态发生了更改,并且该事件已正确映射到PositionUpdated。这是一个非常奇怪的情况,可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我只是注意到我错过了CTOR初始化程序中针对PositionUpdated状态的超级调用,因此未调用该侦听器。这是我的错误,我已经在调试中进行了三天的调试。