是否可以通过后退按钮检测应用程序是否已关闭?

时间:2019-05-07 20:11:43

标签: android flutter

当您通过Android上的“后退”按钮关闭Flutter应用程序时,会出现一些与插件有关的问题。插件的dart / flutter端重新启动,而android部分未重新启动。这会引起麻烦,尤其是在进行诸如音频播放之类的背景活动时。 我认为这是一个关键问题,因此我创建了一个GitHub问题:https://github.com/flutter/flutter/issues/31734

我想采取一种解决方法,因此,如果应用程序通过“后退”按钮关闭,则播放应停止。

我试图通过didChangeAppLifecycleState方法检测后退按钮的关闭动作。但是我可以确定这是正常的关闭动作还是使用后退按钮。

您可以使用audioplayers插件的示例自己尝试。我还在那里创建了一个新的issue

1 个答案:

答案 0 :(得分:1)

您可以使用back_button_interceptor作为中介。

在您的主窗口小部件中:

@override
void initState() {
  super.initState();
  BackButtonInterceptor.add(myInterceptor);
}

@override
void dispose() {
  BackButtonInterceptor.remove(myInterceptor);
  super.dispose();
}

bool myInterceptor(bool stopDefaultButtonEvent) {
  doYourStuff();
  // If you return true, it'll intercept the back button press and your app won't close
  return false;
}

编辑:

在我看来,您无法精确确定是否已通过“后退”按钮关闭了某个应用程序。相反,您可以通过“后退”按钮确定是否要关闭某个应用程序:

bool myInterceptor(bool stopDefaultButtonEvent) {
  String currentRoute = BackButtonInterceptor.getCurrentNavigatorRouteName(context);

  if (currentRoute == '/home') {
    // Back button has been pressed while you're in the home, so the app is going to close
    doYourStuff();
  }

  return false;
}

当然,您必须实现路由才能实现此目的,但这是我能找到的最精确的方法,因为创建叠加层(并因此覆盖后退按钮动作)的所有内容都会更改getCurrentNavigatorRouteName的结果,包括对话框甚至来自PopupMenu的{​​{1}}。