如何在didChangeAppLifecycleState(iOS和Android设备)上完全重启Flutter应用程序

时间:2019-07-26 12:34:08

标签: android ios flutter dart

我有一个要在AppLifeCycleState.paused时完全重启的应用程序

这似乎在android (Pixel 3 XL Api 28)上有效,但不适用于iOS设备。

与iOS相当的本地版本:

在我的本机iOS版本上,我在AppDelegate的applicationDidEnterBackground函数中运行了exit(0)。

我尝试使用WidgetBindingObserver使MyApp成为有状态的,并监听状态的变化。在.paused状态下,我尝试执行exit(0)SystemChannels.platform.invokeMethod<void>('SystemNavigator.pop');

在MyApp的状态内

 @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance.removeObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    switch (state) {
      case AppLifecycleState.paused:
        print('paused state');
        SystemChannels.platform.invokeMethod<void>('SystemNavigator.pop');
        //I have also tried exit(0); here.
        break;
      case AppLifecycleState.resumed:
        print('resumed state');
        break;
      case AppLifecycleState.inactive:
        print('inactive state');
        break;
      case AppLifecycleState.suspending:
        print('suspending state');
        break;
    }
  }

我希望该应用程序将退出,然后再次打开将重新启动,但它根本不会退出。它只是恢复进入暂停状态之前的位置。此行为仅在iOS设备上。

我了解我的代码不是一个完全正常的最小示例-如果您需要我设置示例供人们尝试,请告诉我。

1 个答案:

答案 0 :(得分:0)

好的,所以我已经解决了这个问题,但是我不确定100%为什么以前使用exit(0)的尝试不起作用。

我将didChangeAppLifecycleState函数更改为以下内容。

@override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    switch (state) {
      case AppLifecycleState.paused:
        print('paused state');
        SystemChannels.platform.invokeMethod<void>('SystemNavigator.pop');
        if (Platform.isIOS) {
          exit(0);
        }
        break;
      case AppLifecycleState.resumed:
        print('resumed state');
        break;
      case AppLifecycleState.inactive:
        print('inactive state');
        break;
      case AppLifecycleState.suspending:
        print('suspending state');
        break;
    }
  }

通过添加以下代码,该应用现在可以在android和iOS上退出。

if (Platform.isIOS) {
          exit(0);
        }

如果任何人都能阐明为什么仅靠自己使用exit(0)还是行不通的,我希望能更好地理解这一点。