我正在使用Flutter BLoC软件包来管理我的应用程序的状态,但是自从上次软件包更新(v0.22.1)以来,我的行为很奇怪。
简单来说,我在StreamSubscription
中有一个PositionBloc
状态的EventsBloc
侦听器,但是当我从PositionBloc
添加一个事件时,该侦听器不起作用。
最奇怪的是,我是第一次从EventsBloc
添加事件,但监听器似乎完全被忽略了。
这是我的构建树:
main.dart
:此处显示基于身份验证的主页或登录页面。 AuthenticationBloc
和MoviesBloc
并不重要,或者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.dart
和StatefulWidget
的{{1}}。这里有我的应用程序状态更改器。我使用Flutter TypeAhead包来构建搜索栏,并且从main.dart中看到的_textController
中提供了搜索栏的条目。当我点击条目时,会将事件_focusNode
(本地)添加到LocalsBloc
。
UpdatePosition
我有用于事件和状态的标准Bloc样板,尤其是对于EventsBloc,正如我所说的我已订阅:
PositionBloc
在构建第一个小部件树之后,此侦听器不起作用,但是当我从搜索栏中的某个条目的选择中添加事件UpdatePosition时,PositionBloc的状态发生了更改,并且该事件已正确映射到PositionUpdated。这是一个非常奇怪的情况,可以帮帮我吗?
答案 0 :(得分:0)
我只是注意到我错过了CTOR初始化程序中针对PositionUpdated
状态的超级调用,因此未调用该侦听器。这是我的错误,我已经在调试中进行了三天的调试。