2

我试图在两条路线上共享同一个集团。但是当我从第二条路线回来时,集团会自动处理,所以在第一条路线中,我发现自己所有的流都关闭了。

例如,这是我实例化块的第一条路线(主页),从 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) {
   ...
  }

在第二个屏幕的 dispose 方法中,我只处理了 _formBloc bloc 但 _groupBloc 也被处理了,所以当我回到第一页时,我发现自己处理了 _groupBloc 并且它的所有流都关闭了。

我很难将集团作为道具传递到第二个屏幕,但我不知道这是否是正确的方法。

4

1 回答 1

4

这显然取决于您的 Bloc 的范围,但是没有什么可以阻止您在整个应用程序中共享相同的实例。

IE。只需将整个 MaterialApp 包装在里面BlocProvider<GroupsBloc>(bloc: _groupBloc, child: MaterialApp( ... ))

如果“组”对您的应用程序来说不是全局的,您可能应该只将 bloc 传递给第二个小部件。

于 2019-04-07T22:05:20.373 回答