【发布时间】:2017-12-19 22:39:09
【问题描述】:
如何以编程方式关闭 Flutter 应用程序。 我试过弹出唯一的屏幕,但结果是黑屏。
【问题讨论】:
如何以编程方式关闭 Flutter 应用程序。 我试过弹出唯一的屏幕,但结果是黑屏。
【问题讨论】:
以下在Android 和iOS 中与我完美配合,我使用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');
如here所述
【讨论】:
t work for me... Im 试图向 CupertinoTabScafold 添加退出按钮。使用 ()=>exit(0),它会给出一个带有标签栏的空白屏幕。
SystemNavigator.pop():行不通
exit(0):可以使用,但 Apple 可能会暂停您的应用
请看:
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() 在Android 模拟器下不起作用。该应用程序仍在后台运行。所以我不确定它是否会在真实设备上正常工作。
exit(0)。
SystemNavigator.pop() 退出我的应用并显示崩溃消息,exit(0) 按预期工作
SystemNavigator.pop(...)
您可以使用SystemNavigator.pop() 来做到这一点。
【讨论】:
exit(0); 确实有效
SystemNavigator.pop 被忽略,因为 Apple 的人机界面指南规定应用程序不应自行退出。在 Android 上,它应该可以工作,并且优于调用 dart:io 的退出方法。考虑提出问题:github.com/flutter/flutter/issues/new
已经提供了答案,但请不要在不知道自己在做什么的情况下将它们复制粘贴到您的代码库中:
如果您使用SystemChannels.platform.invokeMethod('SystemNavigator.pop');,请注意doc 明确提及:
指示系统导航器从堆栈中删除此活动 并返回上一个活动。
在 iOS 上,对该方法的调用会被忽略,因为 Apple 的人工 接口指南声明应用程序不应退出 自己。
您可以使用exit(0)。这将使用给定的退出代码立即终止 Dart VM 进程。但请记住,doc 说:
这不会等待任何异步操作终止。使用 因此 exit 很可能会丢失数据。
无论如何doc 也注意到SystemChannels.platform.invokeMethod('SystemNavigator.pop');:
这个方法应该优于调用 dart:io 的退出方法,因为 后者可能会导致底层平台表现得好像 应用程序崩溃了。
所以,记住你在做什么。
【讨论】:
SystemChannels.platform.invokeMethod('SystemNavigator.pop') 而不仅仅是SystemNavigator.pop();?
invokeMethod 我们直接调用原生android pop 方法。当时我写的可能是flutter方法pop不存在。可能是SystemNavigator.pop();调用native方法退出(查看方法源码,我没有查看)。
您可以通过检查平台相关条件来调用它。为 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),
),
);
}
【讨论】:
我正在调用_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 :(
}
}
}
【讨论】:
您可以使用SystemNavigator.pop();Android和iOS使用exit(0);
这里是例子-
if (Platform.isIOS) {
exit(0);
} else {
SystemNavigator.pop();
}
别忘了在顶部导入import 'dart:io';
【讨论】:
这对我有用。创建一个函数,并在您的 onPressed 函数中调用此函数。由于苹果不推荐exit(0) 用于iOS 应用程序,因此我在这里选择了这个库:https://pub.dev/packages/minimize_app。
下面是代码sn-p:
void closeApp(){
if(Platform.isAndroid){
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
}else{
MinimizeApp.minimizeApp();
}
}
【讨论】: