我正在使用BLoC来保持两个嵌套的FullScreenDialogs
之间的状态。
当我按下第一个屏幕时,我正在初始化集团,就像这样
return FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => ProductBlocProvider(child: ProductEntryScreen()),
fullscreenDialog: true
));
},
);
ProductEntryScreen
有一堆TextFields
和一个按钮,而不是打开一个新的FullScreenDialog
。这个新的屏幕也有TextFields
。我遇到的问题是,每当我在第二个TextField
上写一个FullScreenDialog
时,我启动ProductBlocProvider
的onPressed函数再次运行。
重新运行导致Bloc创建一个新实例,所以我最终失去了状态。
我想做的事?也许我做错了所以我会解释我想要实现的目标。
我希望在填充所有字段时保持两个FullScreenDialogs
之间的状态,当我完成时,我想按下一个按钮,将所有数据(两个屏幕)发送到数据库。
问题是我在MaterialPageRoute
的构建器函数中创建了提供程序中的bloc实例。
正在重复调用该构建器函数,并且每次都创建一个新的bloc实例。解决方案是从builde函数中取出bloc实例的创建,如下所示:
return FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
//Here I create the instance
var _bloc = ProductBloc();
Navigator.of(context).push(MaterialPageRoute(
//And I pass the bloc instance to the provider
builder: (BuildContext context) => ProductBlocProvider(bloc: _bloc, child: ProductEntryScreen()),
fullscreenDialog: true
));
},
);