跨不同路线共享集团
Share bloc across different routes
我正在尝试在两条路线上共享同一个集团。
但是当我从第二条路线回来时,集团会自动处理,所以在第一条路线中我发现自己关闭了所有流。
例如,这是我实例化 bloc 的第一条路线(主页),从 api 下载列表并在构建方法中显示它。
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
GroupsBloc _groupBloc;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies(){
super.didChangeDependencies();
_groupBloc = GroupsBloc();
_groupBloc.getAll();
}
@override
void dispose(){
_groupBloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
...
}
}
然后我导航到第二个屏幕,我可以在其中将项目添加到列表中。
_onAddGroupPress(){
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => BlocProvider<GroupsBloc>(bloc: _groupBloc, child: GroupPage()),
fullscreenDialog: true
),
);
}
在第二个屏幕中,我检索了 bloc 并使用它添加了一个项目,然后我返回到主页。
class GroupPage extends StatefulWidget {
@override
_GroupPageState createState() => _GroupPageState();
}
class _GroupPageState extends State<GroupPage> {
FormBloc _formBloc; //another bloc
GroupsBloc _groupBloc;
@override
void initState(){
super.initState();
}
@override
void didChangeDependencies(){
super.didChangeDependencies();
_formBloc = FormBloc();
_groupBloc = BlocProvider.of<GroupsBloc>(context); //retrieve of the bloc
}
@override
void dispose() {
_formBloc?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
...
}
在第二个屏幕的处理方法中,我只处理了 _formBloc bloc,但 _groupBloc 也被处理了,所以当我返回第一页时,我发现自己处理了 _groupBloc 并且它的所有流都关闭了。
我想将 bloc 作为道具传递到第二个屏幕,但我不知道这样做是否正确。
这显然取决于您的 Bloc 范围,但没有什么可以阻止您在整个应用程序中共享同一个实例。
即。只需将整个 MaterialApp 包裹在 BlocProvider<GroupsBloc>(bloc: _groupBloc, child: MaterialApp( ... ))
中
如果 "groups" 对于您的应用不是全局的,您可能应该将 bloc 传递给第二个小部件。
我正在尝试在两条路线上共享同一个集团。 但是当我从第二条路线回来时,集团会自动处理,所以在第一条路线中我发现自己关闭了所有流。
例如,这是我实例化 bloc 的第一条路线(主页),从 api 下载列表并在构建方法中显示它。
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
GroupsBloc _groupBloc;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies(){
super.didChangeDependencies();
_groupBloc = GroupsBloc();
_groupBloc.getAll();
}
@override
void dispose(){
_groupBloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
...
}
}
然后我导航到第二个屏幕,我可以在其中将项目添加到列表中。
_onAddGroupPress(){
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => BlocProvider<GroupsBloc>(bloc: _groupBloc, child: GroupPage()),
fullscreenDialog: true
),
);
}
在第二个屏幕中,我检索了 bloc 并使用它添加了一个项目,然后我返回到主页。
class GroupPage extends StatefulWidget {
@override
_GroupPageState createState() => _GroupPageState();
}
class _GroupPageState extends State<GroupPage> {
FormBloc _formBloc; //another bloc
GroupsBloc _groupBloc;
@override
void initState(){
super.initState();
}
@override
void didChangeDependencies(){
super.didChangeDependencies();
_formBloc = FormBloc();
_groupBloc = BlocProvider.of<GroupsBloc>(context); //retrieve of the bloc
}
@override
void dispose() {
_formBloc?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
...
}
在第二个屏幕的处理方法中,我只处理了 _formBloc bloc,但 _groupBloc 也被处理了,所以当我返回第一页时,我发现自己处理了 _groupBloc 并且它的所有流都关闭了。
我想将 bloc 作为道具传递到第二个屏幕,但我不知道这样做是否正确。
这显然取决于您的 Bloc 范围,但没有什么可以阻止您在整个应用程序中共享同一个实例。
即。只需将整个 MaterialApp 包裹在 BlocProvider<GroupsBloc>(bloc: _groupBloc, child: MaterialApp( ... ))
如果 "groups" 对于您的应用不是全局的,您可能应该将 bloc 传递给第二个小部件。