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

nvbavucw  于 2023-06-03  发布在  Flutter
关注(0)|答案(1)|浏览(356)

我有一个应用程序,我想完全重新启动时,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设备。
我明白我的代码不是一个完全工作的最小示例-如果您需要我设置一个示例供人们尝试,请告诉我。

v8wbuo2f

v8wbuo2f1#

好了,我已经解决了这个问题,但我不是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)本身不起作用,我很想更好地理解这一点。

相关问题