简体   繁体   English

在 flutter_bloc 包中处理对象后如何处理调度?

[英]How to handle dispatch after object dispose in flutter_bloc package?

I am using flutter_bloc & bloc package to manage state.我正在使用 flutter_bloc 和 bloc 包来管理状态。

In child page i am initialize bloc & while back parent page dispose the bloc object.在子页面中,我初始化 bloc & 而返回父页面处理 bloc 对象。

When i comes back immediately on parent page that time bloc throw error Unhandled Exception: Bad state: Cannot add new events after calling close because on child page on load i am calling api in bloc.当我立即返回父页面时,bloc 抛出错误Unhandled Exception: Bad state: Cannot add new events after calling close因为在加载时的子页面上,我正在调用 bloc 中的 api。 which trigger state after completed api.完成api后触发状态。 At that time already bloc object disposed.那个时候已经 bloc 对象处理掉了。

[ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Bad state: Cannot add new events after calling close
E/flutter (17290): #0      _BroadcastStreamController.add (dart:async/broadcast_stream_controller.dart:249:24)
E/flutter (17290): #1      Subject._add (package:rxdart/src/subjects/subject.dart:124:16)
E/flutter (17290): #2      Subject.add (package:rxdart/src/subjects/subject.dart:118:5)
E/flutter (17290): #3      Bloc._bindStateSubject.<anonymous closure> (package:bloc/src/bloc.dart:90:23)
E/flutter (17290): #4      Stream.forEach.<anonymous closure>.<anonymous closure> (dart:async/stream.dart:814:45)
E/flutter (17290): #5      _runUserCode (dart:async/stream_pipe.dart:11:23)
E/flutter (17290): #6      Stream.forEach.<anonymous closure> (dart:async/stream.dart:814:11)
E/flutter (17290): #7      _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter (17290): #8      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (17290): #9      _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
E/flutter (17290): #10     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
E/flutter (17290): #11     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263:7)
E/flutter (17290): #12     _SyncBroadcastStreamController._sendData (dart:async/broadcast_stream_controller.dart:375:20)
E/flutter (17290): #13     _BroadcastStreamController._add (dart:async/broadcast_stream_controller.dart:287:5)
E/flutter (17290): #14     _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter (17290): #15     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (17290): #16     _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
E/flutter (17290): #17     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
E/flutter (17290): #18     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263:7)
E/flutter (17290): #19     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:132:11)
E/flutter (17290): #20     _ForwardingStream._handleData (dart:async/stream_pipe.dart:98:10)
E/flutter (17290): #21     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:164:13)
E/flutter (17290): #22     _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter (17290): #23     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (17290): #24     _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
E/flutter (17290): #25     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
E/flutter (17290): #26     _DelayedData.perform (dart:async/stream_impl.dart:591:14)
E/flutter (17290): #27     _StreamImplEvents.handleNext (dart:async/stream_impl.dart:707:11)
E/flutter (17290): #28     _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:667:7)
E/flutter (17290): #29     _rootRun (dart:async/zone.dart:1120:38)
E/flutter (17290): #30     _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter (17290): #31     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
E/flutter (17290): #32     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
E/flutter (17290): #33     _rootRun (dart:async/zone.dart:1124:13)
E/flutter (17290): #34     _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter (17290): #35     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
E/flutter (17290): #36     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
E/flutter (17290): #37     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (17290): #38     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

So how handle these when bloc already disposed ?那么当 bloc 已经被处理时如何处理这些呢?

Use common bloc for parent and child.为父和子使用公共块。 Create/Initialise bloc in parent when calling child do as following:调用子级时在父级中创建/初始化 bloc 执行以下操作:

`BlocProvider.value( value: BlocProvider.of<BlocA>(context), child: ScreenA(), );`

By writing above you will keep alive the bloc from dispose, Then you can simply access bloc in child as following:通过上面的编写,您将使 bloc 保持活动状态,然后您可以简单地访问 child 中的 bloc,如下所示:

BlocProvider.of<BlocA>(context)

Just don't dispose it in child, And then, when you go back to parent from child your bloc won't get disposed and it will only dispose when parent destroy or dispose.只是不要在孩子中处置它,然后,当你从孩子回到父母时,你的集团不会被处置,它只会在父母销毁或处置时处置。

Everything is written there in readme: https://pub.dev/packages/flutter_bloc一切都写在自述文件中: https : //pub.dev/packages/flutter_bloc

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM