Flutter如何编程退出应用程序

220

我该如何以编程方式关闭一个Flutter应用程序。 我已尝试弹出唯一的屏幕,但这会导致黑屏。

14个回答

221

以下方法在我的设备上 AndroidiOS 上都能完美运行,我使用了来自 dart:ioexit(0) 方法。

import 'dart:io';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new ... (...),
          floatingActionButton: new FloatingActionButton(
            onPressed: ()=> exit(0),
            tooltip: 'Close app',
            child: new Icon(Icons.close),
          ), 
    );
  }

2019年1月更新: 首选方案是:

SystemChannels.platform.invokeMethod('SystemNavigator.pop');

此处所述


那对我没用... 我正在尝试向CupertinoTabScafold添加一个退出按钮。使用()=>exit(0),它会在选项卡栏中显示一个空白屏幕。 - Ricardo Gonçalves
4
可以使用,但是苹果禁止自定义退出按钮,如果应用程序中有此功能,可能会被拒绝。 - Dmytro Rostopira
在我的解决方案中,出现了“Undefined name SystemChannels”错误消息。 - user_odoo

191

1
似乎在Android模拟器下SystemNavigator.pop()无法正常工作。应用程序仍在后台运行。因此,我不确定它是否能在真实设备上正常工作。 - BambinoUA
2
@AleksTi 它只是退出应用程序,而不是关闭 VM 进程。你可以尝试使用 exit(0) 来满足你的需求。 - CopsOnRoad
1
有没有一种适用于两个平台且被推荐的方法? - B.shruti
1
@B.shruti 在iOS中没有办法实现退出功能。对于Android,请使用SystemNavigator.pop(...) - CopsOnRoad
@tim-montague 我没有使用单词“将会”,我说的是“可能”,你可以在这里这里以及这里阅读更多相关信息。 - CopsOnRoad
显示剩余5条评论

52

1
在Android和iOS上都没有任何反应。使用exit(0);可以解决问题。 - Theo
2
在iOS上,SystemNavigator.pop被忽略了,因为苹果的人机界面指南规定应用程序不应该退出自己。在Android上,它应该可以工作,并且比调用dart:io的exit方法更受欢迎。考虑提交一个问题:https://github.com/flutter/flutter/issues/new - Collin Jackson
有什么想法可以在Flutter中实现iOS的功能? - iPatel
@iPatel 你可以在iOS中使用exit(0),就这样。 - CopsOnRoad
你说的拒绝怎么办啊 ;( - iPatel
显示剩余5条评论

51

已经提供了答案,但请不要只是将它们复制粘贴到您的代码中而不知道自己在做什么:

如果您使用 SystemChannels.platform.invokeMethod('SystemNavigator.pop'); 请注意,文档 中明确指出:

指示系统导航器从堆栈中删除此活动并返回到上一个活动。

在 iOS 上,调用此方法将被忽略,因为苹果的人机界面准则规定应用程序不应退出自身。

您可以使用 exit(0)。这将立即终止具有给定退出码的Dart VM进程。但请记住,文档 表示:

这不会等待任何异步操作终止。因此,使用 exit 很可能会丢失数据。

无论如何, 文档 也指出了 SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

应优先使用此方法,而不是调用dart:io的exit方法,因为后者可能导致底层平台表现得好像应用程序已崩溃。

所以,请记住自己在做什么。


20
你写了很多聪明的笔记,但是...在iOS中以编程方式退出应用程序而不会潜在地挂起,有什么正确的方法呢? - BambinoUA
为什么要使用 SystemChannels.platform.invokeMethod('SystemNavigator.pop') 而不是简单地使用 SystemNavigator.pop(); - Csaba Toth
1
@CsabaToth 两种方式都可以,使用 invokeMethod 我们直接调用本地 Android 的 pop 方法。那个时候,可能 Flutter 的 pop 方法还不存在,也许 SystemNavigator.pop(); 调用了本地方法来退出(检查一下方法源代码,我还没有检查过)。 - Blasanka

23

你可以通过检查不同平台的条件来调用此功能。在 Android 和 iOS 上单击时执行不同的操作。

import 'dart:io' show Platform;
import 'package:flutter/services.dart';
    
RaisedButton(
  onPressed: () {
    if (Platform.isAndroid) {
      SystemNavigator.pop();
    } else if (Platform.isIOS) {
      exit(0);
    }
  },
  child: Text("close app")
)

12

我更喜欢使用

 Future.delayed(const Duration(milliseconds: 1000), () {
        SystemChannels.platform.invokeMethod('SystemNavigator.pop');
      });

虽然exit(0)也能起作用,但它会使应用程序突然关闭,并且看起来不太好,有点像应用程序已经崩溃了。

 Future.delayed(const Duration(milliseconds: 1000), () {
       exit(0);
      });

10

到目前为止,我所看到的在两个应用商店都被接受的唯一解决方案是:

对于安卓:

SystemChannels.platform.invokeMethod('SystemNavigator.pop');

对于iOS:

虽然无法关闭应用程序,但你可以使用https://pub.dev/packages/minimize_app将其移至后台,如下所示:

MinimizeApp.minimizeApp();

享受吧!


3

这对我有用;

import 'dart:io';

@override
Widget build(BuildContext context) {
  return new Scaffold(
    appBar: new AppBar(
      title: new Text(widget.title),
    ),
    body: new ... (...),
      floatingActionButton: new FloatingActionButton(
        onPressed: ()=> exit(0),
        tooltip: 'Close app',
        child: new Icon(Icons.close),
      ), 
  );
}

2
我正在调用_getOutOfApp函数,这不是一个包;
    void _getOutOfApp {

      if (Platform.isIOS) {

        try {
          exit(0); 
        } catch (e) {
          SystemNavigator.pop(); // for IOS, not true this, you can make comment this :)
        }

      } else {

        try {
          SystemNavigator.pop(); // sometimes it cant exit app  
        } catch (e) {
          exit(0); // so i am giving crash to app ... sad :(
        }

      }
    }

2
我为关闭创建了一个mixin,如下所示:

import 'dart:io';
import 'package:flutter/services.dart';

mixin AppCloser {
  void closeApp() {
    if (Platform.isAndroid) {
      SystemNavigator.pop();
    } else if (Platform.isIOS) {
      exit(0);
    }
  }
}

然后我只需像这样将它添加到页面中:
class _HomePageState extends State<HomePage> with AppCloser {
    ...

    child: ElevatedButton(
        onPressed: () => { closeApp() },
        child: Text('Close'),
    ),

    ...   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接