颤动如何程序化地退出应用程序

如何以编程方式关闭 Flutter 应用程序。 我尝试弹出唯一的屏幕,但结果是一个黑色的屏幕。

152697 次浏览

你可以用 SystemNavigator.pop()做到这一点。

下面的工作与我在 AndroidiOS完美,我使用 exit(0)dart:io

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');

给你所述

答案已经提供,但请不要只是复制粘贴到您的代码基,而不知道您在做什么:

如果使用 SystemChannels.platform.invokeMethod('SystemNavigator.pop');,请注意 医生明确提到:

指示系统导航器从堆栈中删除此活动 然后回到之前的活动。

在 iOS 系统中,对这个方法的调用被忽略,因为苹果的人类 接口准则指出应用程序不应退出 他们自己。

你可以使用 exit(0)。这将立即用给定的退出代码终止 Dart VM 进程。但请记住,医生表示:

这不等待任何异步操作终止 因此出口很可能丢失数据。

无论如何,医生也注意到 SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

此方法应优先于调用 dart: io 的 exit 方法,如 后者可能导致底层平台的行为就好像 应用程序崩溃了。

所以,记住你在做什么。

IOS 系统

SystemNavigator.pop() : 是否 < strong > 不工作

exit(0) : 工作,但苹果可能 < strong > 暂停你的应用程序

请参阅:
Https://developer.apple.com/library/archive/qa/qa1561/_index.html


为了安卓

SystemNavigator.pop() : 工作,是 推荐退出应用程序的方式。

exit(0) : 也可以工作,但它是 不推荐,因为它立即终止了 Dart VM 进程,用户可能会认为应用程序刚刚崩溃。

请参阅:
Https://api.flutter.dev/flutter/services/systemnavigator/pop.html

这对我有用;

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),
),
);
}

我更喜欢用

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

虽然,exit (0)也可以工作,但应用程序突然关闭,看起来不太好,有点像应用程序已经崩溃。

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

你可以通过检查平台相关条件来调用它。

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")
)

到目前为止,我看到的唯一被两家店接受的解决方案是:

机器人:

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

Ios:

关闭应用程序是不可能的,但是你可以用 https://pub.dev/packages/minimize_app把它移到后台,比如:

MinimizeApp.minimizeApp();

好好享受吧!

我正在调用 _ 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 :(
}


}
}

这招对我很管用。创建一个函数,然后在 onPressed函数中调用这个函数。由于苹果不推荐 exit(0)用于 iOS应用程序,我在这里选择了这个库: https://pub.dev/packages/minimize_app。 下面是代码片段:

void closeApp(){
if(Platform.isAndroid){
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
}else{
MinimizeApp.minimizeApp();
}
}

对于 仿生人可以使用 SystemNavigator.pop();,对于 IOS可以使用 exit(0);

这里是例子-

if (Platform.isIOS) {
exit(0);
} else {
SystemNavigator.pop();
}

别忘了上面还有进口 import 'dart:io';

我为结尾创建了一个混音,像这样:

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'),
),


...
}