Der*_*ens 7 navigation stream flutter
我对带有抖动的集团平台有疑问/问题。目前,我正在这样启动我的应用
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(),
...
},
));
Run Code Online (Sandbox Code Playgroud)
这样我就可以像这样检索/访问myBloc
myBloc = BlocProvider.of(context) as MyBloc;
Run Code Online (Sandbox Code Playgroud)
和状态所代表的数据
BlocBuilder<MyBlocEvent, MyObject>(
bloc: myBloc,
builder: (BuildContext context, MyObject myObject) {
....
var t = myObject.data;
....
myBloc.onFirstEvent();
...
};
Run Code Online (Sandbox Code Playgroud)
无论我在哪里需要它。
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;
}
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是,一旦我改变状态值并调用
Navigator.pop(context)
Run Code Online (Sandbox Code Playgroud)
回到当前堆栈中,我无法更改状态,因为底层流似乎已关闭。它失败并显示以下消息:
引发了另一个异常:错误状态:调用close之后无法添加新事件”
现在这只会在我打电话给pop之后发生。如果我只按新的屏幕,我可以愉快地更改状态数据而不会出现任何问题。
我在这里的导航方面做错了吗,还是在颤振或集团模式本身方面我没有发现其他问题?
错误状态:调用 close 后无法添加新事件
此错误意味着你正在呼吁add
在StreamController
之后已经叫close
:
var controller = StreamController<int>();
controller.close();
controller.add(42); // Bad state: Cannot add new events after calling close
Run Code Online (Sandbox Code Playgroud)
这可能与您close
在dispose
方法内部调用“错误”小部件有关。
一个好的经验法则是永远不要在创建它的小部件之外处置/关闭对象。这确保您不能使用已处理的对象。
小智 2
希望这对您的调试有所帮助。
应用程序的导航取决于您的小部件设计。
我使用无状态小部件并使用 bloc 的数据渲染视图。
每当我导航到另一个页面时,我都会弹出当前小部件并导航到下一个小部件。
下一个无状态小部件声明块,然后在后续的无状态小部件中应该包含类似的调用MyBloc.dispatch(event(param1: value1, param2: value2));
在 MyBloc 中,您需要设置包含最终值的状态工厂;
@override
Stream<MyObject> mapEventToState( MyObject state, MyBlocEvent event) async* {
if (event is FirstEvent) {
// set it in the state, so this code is omitted
// state.data = "test1";
// add this
yield state.sampleState([], "test1");
}
else if (event is SecondEvent) {
// state.otherData = 5;
yield state.sampleState([], 5);
} else {
yield state.sampleState([], null);
}
Run Code Online (Sandbox Code Playgroud)
MyObjectState 需要这样设置,
class MyObjectState {
final List<Bar> bars;
final String Foo;
const MyObjectState(
{this.bars,
this.foo,
});
factory MyObjectState.sampleState(List<Bar> barList, String value1) {
return MyObjectState(bars: barList, foo: message);
}
}
Run Code Online (Sandbox Code Playgroud)
这样无状态小部件就可以像这样使用块
MyBloc.currentState.sampleState.foo
您可以尝试运行 Felix Angelov 的 flutter 项目。 登录流程示例
归档时间: |
|
查看次数: |
1463 次 |
最近记录: |