Android 无法停止聆听飘荡的溪流

Android 无法停止聆听飘荡的溪流,android,flutter,stream,activity-recognition,Android,Flutter,Stream,Activity Recognition,我在Flitter中使用了一个用于活动识别的库,它为来自手机传感器的活动识别数据创建了一个流,我可以启动该流,但当底部导航栏的选项卡更改时,无法停止该流 我遵循这个例子,所以现在我想有一个启动和停止按钮,可以启动和停止流监听 我是这样创造的: Stream<Activity> stream; StreamController<Activity> streamController = new StreamController(); stream = ActivityRec

我在Flitter中使用了一个用于活动识别的库,它为来自手机传感器的活动识别数据创建了一个流,我可以启动该流,但当底部导航栏的选项卡更改时,无法停止该流

我遵循这个例子,所以现在我想有一个启动和停止按钮,可以启动和停止流监听

我是这样创造的:

Stream<Activity> stream;
StreamController<Activity> streamController = new StreamController();

stream = ActivityRecognition.activityUpdates();
if(!streamController.hasListener){
      streamController.addStream(stream);
      streamController.stream.listen(onData);
  }

Future<void> onData(Activity activity) async {
    String formattedDate() {
      var date = DateTime.now();
      return date.day.toString() +
          "/" +
          date.month.toString() +
          "/" +
          date.year.toString() +
          "  " +
          date.hour.toString() +
          ":" +
          date.minute.toString() +
          ":" +
          date.second.toString();
    }

    insertActivity(RecognizedData(
        activity: activity.type.toString(),
        confidence: activity.confidence,
        dateTime: formattedDate()));
  }
但当标签从底部导航栏更改时,它不会停止流媒体, 所以,当我再次打开该选项卡时,它会显示“坏状态:流已被侦听”,请帮助我解决此问题


提前感谢。

即使其中一个选项卡不可见,也不会调用
dispose
,因为该选项卡的父级仍然存在于路由堆栈上

你有两个选择

  • 使流成为广播流
  • 下面
  • 不要让流成为
    广播
    在需要时像这样更改侦听器功能

    
      //obtain the subscription only once, with a dummy listener if you prefer
      //stream.listen just sets the onData function
      var sub = stream.listen((event){});
    
      //just change the listener like this in the required tabs
      //tab A
      sub.onData((event) { });
    
      //tab B
      sub.onData((event) { });
    

    选项卡不是页面,因此当您更改它们时,您没有运行dispose或deactivate(我假设您的打印语句没有运行?),我看不出您是否在initState之外设置流,但假设您是,因为这可以解释错误。更改选项卡时,InitState也不应重新运行。
    
      //obtain the subscription only once, with a dummy listener if you prefer
      //stream.listen just sets the onData function
      var sub = stream.listen((event){});
    
      //just change the listener like this in the required tabs
      //tab A
      sub.onData((event) { });
    
      //tab B
      sub.onData((event) { });