【发布时间】:2019-03-28 10:25:26
【问题描述】:
我有一个关于颤振的 bloc plattern 的问题/问题。 目前,我正在像这样启动我的应用程序
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return BlocProvider(
bloc: MyBloc(),
child: MaterialApp(
title: "MyApp",
home: MyHomePage(),
routes: {
'/homePage': (context) => MyHomePage(),
'/otherPage': (context) => OtherPage(),
'/otherPage2': (context) => OtherPage2(),
...
},
));
这样我就可以像检索/访问 myBloc 一样
myBloc = BlocProvider.of(context) as MyBloc;
以及状态所代表的数据
BlocBuilder<MyBlocEvent, MyObject>(
bloc: myBloc,
builder: (BuildContext context, MyObject myObject) {
....
var t = myObject.data;
....
myBloc.onFirstEvent();
...
};
在我需要的地方。
MyBloc 是这样实现的:
abstract clas MyBlocEvent {}
class FirstEvent extends MyBlocEvent {}
class SecondEvent extends MyBlocEvent {}
class MyBloc extends Bloc<MyBlocEvent , MyObject>
void onFirstEvent()
{
dispatch(FirstEvent());
}
void onSecondEvent()
{
dispatch(SecondEvent());
}
@override
Stream<MyObject> mapEventToState( MyObject state, MyBlocEvent event) async* {
if (event is FirstEvent) {
state.data = "test1";
}
else if (event is SecondEvent) {
state.otherData = 5;
}
yield state;
}
我现在遇到的问题是,一旦我改变状态值并调用
Navigator.pop(context)
要返回当前堆栈,我无法再更改任何状态,因为底层流似乎已关闭。它失败并显示消息:
抛出了另一个异常:Bad state: Cannot add new events after call close"
现在这只发生在我调用 pop 之后。如果我只推送新屏幕,我可以愉快地更改状态数据而不会出现任何问题。
我是否在此处的导航方面做错了什么,或者关于颤振或 bloc 模式本身还有什么我没有发现的吗?
【问题讨论】:
-
我相信它是使用的 BlocProvider,我刚刚切换到 pub.dartlang.org/packages/provider 并且这不再发生在我身上......我们会看到。不过希望得到更好的解释。
标签: stream navigation flutter