Flutter 如何在关闭颤振应用程序时处理流?

Flutter 如何在关闭颤振应用程序时处理流?,flutter,Flutter,我的颤振应用程序中有一个流,它持续检测网络变化。它在主功能中定义 Map _source = {ConnectivityResult.none: false}; CurrentConnectivity _connectivity = CurrentConnectivity.instance; void main() async{ WidgetsFlutterBinding.ensureInitialized(); await init(); HttpOverrides.global

我的颤振应用程序中有一个流,它持续检测网络变化。它在主功能中定义

Map _source = {ConnectivityResult.none: false};
CurrentConnectivity _connectivity = CurrentConnectivity.instance;
void main() async{
  WidgetsFlutterBinding.ensureInitialized();

  await init();
  HttpOverrides.global = new MyHttpOverrides();


  _connectivity.initialise();
  _connectivity.myStream.listen((source) {
    _source=source;
  }, onError: (err) {
    print(err);
  }, cancelOnError: false);

  runApp(AppWidget());
  _connectivity.disposeStream();
}

但是当我导航时,我得到了这个例外

例外情况

E/flutter ( 6822): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Bad state: Cannot add new events after calling close
E/flutter ( 6822): #0      _BroadcastStreamController.add (dart:async/broadcast_stream_controller.dart:251:24)
E/flutter ( 6822): #1      _StreamSinkWrapper.add (dart:async/stream_controller.dart:873:13)
E/flutter ( 6822): #2      CurrentConnectivity._checkStatus (package:iris_flutter/core/network/current_connectivity.dart:61:21)
E/flutter ( 6822): #3      _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6822): #4      _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6822): #5      _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter ( 6822): #6      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter ( 6822): #7      Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter ( 6822): #8      Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter ( 6822): #9      _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:36:15)
E/flutter ( 6822): #10     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:298:13)
E/flutter ( 6822): #11     SendOfflineRequests.call (package:iris_flutter/features/faculty/attendance/domain/usecases/offline_requests/send_offline_requests.dart)
E/flutter ( 6822): #12     _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6822): #13     _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6822): #14     _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter ( 6822): #15     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter ( 6822): #16     Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter ( 6822): #17     Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter ( 6822): #18     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:36:15)
E/flutter ( 6822): #19     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:298:13)
E/flutter ( 6822): #20     OfflineClassesRepositoryImpl.sendOfflineRequests (package:iris_flutter/features/faculty/attendance/data/repositories/offline_requests_repository_impl.dart)
E/flutter ( 6822): #21     _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6822): #22     _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6822): #23     _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter ( 6822): #24     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter ( 6822): #25     Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter ( 6822): #26     Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter ( 6822): #27     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:36:15)
E/flutter ( 6822): #28     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:298:13)
E/flutter ( 6822): #29     StudentDetailsFacultyLocalDataSourceImpl.deleteAllMarkedRecords (package:iris_flutter/features/faculty/attendance/data/datasources/students/student_details_faculty_local_data_source.dart)
E/flutter ( 6822): #30     _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6822): #31     _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6822): #32     _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter ( 6822): #33     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter ( 6822): #34     Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter ( 6822): #35     Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter ( 6822): #36     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:36:15)
E/flutter ( 6822): #37     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:298:13)
E/flutter ( 6822): #38     LocalStorage.deleteAllStoredMarkings (package:iris_flutter/core/util/local_storage.dart)
E/flutter ( 6822): #39     _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6822): #40     _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6822): #41     _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter ( 6822): #42     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter ( 6822): #43     Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter ( 6822): #44     Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter ( 6822): #45     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:36:15)
E/flutter ( 6822): #46     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:298:13)
E/flutter ( 6822): #47     DeleteStatement.go.<anonymous closure> (package:moor/src/runtime/query_builder/statements/delete.dart)
E/flutter ( 6822): #48     _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6822): #49     _
I/Toast   ( 6822): Show toast from OpPackageName:com.example.iris_flutter, PackageName:com.example.iris_flutter

E/flatter(6822):[错误:flatter/lib/ui/ui\u dart\u state.cc(157)]未处理的异常:错误状态:调用close后无法添加新事件
E/flatter(6822):#0 BroadcastStreamController.add(dart:async/broadcast_stream_controller.dart:251:24)
E/颤振(6822):#1 _StreamSinkWrapper.add(dart:async/stream_controller.dart:873:13)
电子/颤振(6822):#2电流连通性。_检查状态(包:iris_颤振/核心/网络/电流连通性。dart:61:21)
E/颤振(6822):#3 RootRunnary(dart:async/zone.dart:1192:38)
E/flatter(6822):#4 _CustomZone.runUnary(dart:async/zone.dart:1085:19)
E/flatter(6822):#5 FutureListener.handleValue(dart:async/future_impl.dart:141:18)
E/flatter(6822):#6 Future._-propagateToListeners.handleValueCallback(dart:async/Future_-impl.dart:682:45)
E/flatter(6822):#7未来。#传播给监听器(dart:async/Future\u impl.dart:711:32)
E/颤振(6822):#8未来。_完成值(dart:async/Future_impl.dart:526:5)
E/flatter(6822):#9 AsyncAwaitCompleter.complete(dart:async patch/async patch.dart:36:15)
E/颤振(6822):#10#完成同步返回(dart:async patch/async patch.dart:298:13)
E/flatter(6822):#11 SendOfflineRequests.call(包:iris_flatter/features/faculty/attention/domain/usecases/offline_requests/send_offline_requests.dart)
E/颤振(6822):#12 35;根运行单位(dart:async/zone.dart:1192:38)
E/flatter(6822):#13 _CustomZone.runUnary(dart:async/zone.dart:1085:19)
E/flatter(6822):#14 FutureListener.handleValue(dart:async/future_impl.dart:141:18)
E/flatter(6822):#15 Future._propagateToListeners.handleValueCallback(dart:async/Future_impl.dart:682:45)
E/颤振(6822):#16未来。(dart:async/Future\u impl.dart:711:32)
E/flatter(6822):#17 Future._completewith value(dart:async/Future_impl.dart:526:5)
E/flatter(6822):#18 AsyncAwaitCompleter.complete(dart:async patch/async patch.dart:36:15)
E/颤振(6822):#19完成同步返回(dart:async patch/async patch.dart:298:13)
E/flatter(6822):#20脱机类存储库impl.send脱机请求(包:iris_flatter/features/faculty/attention/data/repositories/offline请求库impl.dart)
E/颤振(6822):#21 35;根运行单位(dart:async/zone.dart:1192:38)
E/flatter(6822):#22 _CustomZone.runUnary(dart:async/zone.dart:1085:19)
E/flatter(6822):#23 FutureListener.handleValue(dart:async/future_impl.dart:141:18)
E/flatter(6822):#24 Future._-propagateToListeners.handleValueCallback(dart:async/Future_-impl.dart:682:45)
E/颤振(6822):#25未来。"传播给监听器(dart:async/Future\u impl.dart:711:32)
E/颤振(6822):#26 Future._completeWithValue(dart:async/Future_impl.dart:526:5)
E/flatter(6822):#27 AsyncAwaitCompleter.complete(dart:async patch/async patch.dart:36:15)
E/颤振(6822):#28完成同步返回(dart:async patch/async patch.dart:298:13)
E/Flatter(6822):#29学生详细信息AcultyLocalDataSourceImpl.deleteAllMarkedRecords(包:iris_Flatter/features/faculty/Attention/data/datasources/students/student_详细信息_faculty_local_数据_source.dart)
E/颤振(6822):#30(dart:async/zone.dart:1192:38)
E/flatter(6822):#31 _CustomZone.runUnary(dart:async/zone.dart:1085:19)
E/flatter(6822):#32 FutureListener.handleValue(dart:async/future_impl.dart:141:18)
E/flatter(6822):#33 Future._-propagateToListeners.handleValueCallback(dart:async/Future_-impl.dart:682:45)
E/颤振(6822):#34未来。(dart:async/Future\u impl.dart:711:32)
E/flatter(6822):#35 Future._completewith value(dart:async/Future_impl.dart:526:5)
E/颤振(6822):#36 AsyncAwaitCompleter.complete(dart:async patch/async patch.dart:36:15)
E/颤振(6822):#37完成同步返回(dart:async patch/async patch.dart:298:13)
E/flatter(6822):#38 LocalStorage.deleteAllStoredMarkings(包:iris_flatter/core/util/local_storage.dart)
E/颤振(6822):#39 RootRunnary(dart:async/zone.dart:1192:38)
E/flatter(6822):#40 _CustomZone.runUnary(dart:async/zone.dart:1085:19)
E/flatter(6822):#41 FutureListener.handleValue(dart:async/future_impl.dart:141:18)
E/flatter(6822):#42 Future._-propagateToListeners.handleValueCallback(dart:async/Future_-impl.dart:682:45)
E/颤振(6822):#43未来。(dart:async/Future\u impl.dart:711:32)
E/flatter(6822):#44 Future._completewith value(dart:async/Future_impl.dart:526:5)
E/flatter(6822):#45 AsyncAwaitCompleter.complete(dart:AsyncPatch/AsyncPatch.dart:36:15)
E/颤振(6822):#46完成同步返回(dart:async patch/async patch.dart:298:13)
E/颤振(6822):#47.go。(包:moor/src/runtime/query\u builder/statements/delete.dart)
E/颤振(6822):#48 RootRunnary(dart:async/zone.dart:1192:38)
E/颤振(6822):#49_
I/Toast(6822):显示来自OpPackageName:com.example.iris_flight的Toast,PackageName:com.example.iris_flight
如果我不处理溪流,它会起作用,但我听说让溪流开着不是一个好的做法。 是否有更好的方法关闭该流,或者是否有必要关闭该流

编辑1 对于一些说我需要使用WidgetsBindingObserver的答案,我想指出我需要在main中初始化流,否则如果我在有状态/无状态小部件中初始化它,会多次检测到连接更改,这会破坏我编写的代码中的一些逻辑

class LifeCycle extends StatefulWidget {
  @override
  _LifeCycleState createState() => _LifeCycleState();
}
class _LifeCycleState extends State<LifeCycle> with WidgetsBindingObserver {

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }
  
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print(state);
    if(state==AppLifecycleState.paused){
      GlobalClassThatInitialisesStream.disposeConnectivityStream();
    }
    if(state==AppLifecycleState.resumed){
      GlobalClassThatInitialisesStream.initialiseConnectivityStream();
    }
  }

  @override
  Widget build(BuildContext context) {
    return AppWidget();
  }
}
类生命周期扩展了StatefulWidget{
@凌驾
_LifeCycleState createState()=>\u生命周期
@override
void dispose() {
  // you dispose your stream here
  // or check if that works out _connectivity.dispose();
  _connectivity.disposeStream();
  super.dispose();
}