我该如何以编程方式关闭一个Flutter应用程序。 我已尝试弹出唯一的屏幕,但这会导致黑屏。
以下方法在我的设备上 Android
和 iOS
上都能完美运行,我使用了来自 dart:io
的 exit(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');
如此处所述
SystemNavigator.pop()
: 无效
exit(0)
: 有效,但苹果公司可能会暂停您的应用程序
请查看:
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
SystemNavigator.pop()
无法正常工作。应用程序仍在后台运行。因此,我不确定它是否能在真实设备上正常工作。 - BambinoUAexit(0)
来满足你的需求。 - CopsOnRoadSystemNavigator.pop(...)
。 - CopsOnRoadSystemNavigator.pop()
来完成此操作。exit(0);
可以解决问题。 - TheoSystemNavigator.pop
被忽略了,因为苹果的人机界面指南规定应用程序不应该退出自己。在Android上,它应该可以工作,并且比调用dart:io
的exit方法更受欢迎。考虑提交一个问题:https://github.com/flutter/flutter/issues/new - Collin Jackson已经提供了答案,但请不要只是将它们复制粘贴到您的代码中而不知道自己在做什么:
如果您使用 SystemChannels.platform.invokeMethod('SystemNavigator.pop');
请注意,文档 中明确指出:
指示系统导航器从堆栈中删除此活动并返回到上一个活动。
在 iOS 上,调用此方法将被忽略,因为苹果的人机界面准则规定应用程序不应退出自身。
您可以使用 exit(0)
。这将立即终止具有给定退出码的Dart VM进程。但请记住,文档 表示:
这不会等待任何异步操作终止。因此,使用 exit 很可能会丢失数据。
无论如何, 文档 也指出了 SystemChannels.platform.invokeMethod('SystemNavigator.pop');
:
应优先使用此方法,而不是调用dart:io的exit方法,因为后者可能导致底层平台表现得好像应用程序已崩溃。
所以,请记住自己在做什么。
SystemChannels.platform.invokeMethod('SystemNavigator.pop')
而不是简单地使用 SystemNavigator.pop();
? - Csaba TothinvokeMethod
我们直接调用本地 Android 的 pop
方法。那个时候,可能 Flutter 的 pop
方法还不存在,也许 SystemNavigator.pop();
调用了本地方法来退出(检查一下方法源代码,我还没有检查过)。 - Blasanka你可以通过检查不同平台的条件来调用此功能。在 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")
)
我更喜欢使用
Future.delayed(const Duration(milliseconds: 1000), () {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
});
虽然exit(0)也能起作用,但它会使应用程序突然关闭,并且看起来不太好,有点像应用程序已经崩溃了。
Future.delayed(const Duration(milliseconds: 1000), () {
exit(0);
});
到目前为止,我所看到的在两个应用商店都被接受的唯一解决方案是:
对于安卓:
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
对于iOS:
虽然无法关闭应用程序,但你可以使用https://pub.dev/packages/minimize_app将其移至后台,如下所示:
MinimizeApp.minimizeApp();
享受吧!
这对我有用;
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),
),
);
}
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 :(
}
}
}
:
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'),
),
...
}