Flutter 如何以编程方式退出应用程序

Posted

技术标签:

【中文标题】Flutter 如何以编程方式退出应用程序【英文标题】:Flutter how to programmatically exit the app 【发布时间】:2017-12-19 22:39:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:

以下在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');

如here所述

【讨论】:

没有t work for me... Im 试图向 CupertinoTabScafold 添加退出按钮。使用 ()=>exit(0),它会给出一个带有标签栏的空白屏幕。 它有效。但是 Apple 禁止自定义退出按钮,如果你有一个应用程序,它可能会拒绝 @HasanAYousef 在我的解决方案中获取消息未定义名称 SystemChannels【参考方案2】:

对于 iOS

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 模拟器下不起作用。该应用程序仍在后台运行。所以我不确定它是否会在真实设备上正常工作。 @AleksTi 它只是退出应用程序,它不会关闭 VM 进程。您可以根据需要尝试exit(0) SystemNavigator.pop() 退出我的应用并显示崩溃消息,exit(0) 按预期工作 有没有一种方法适用于两个平台并且也被推荐? @B.shruti 在 iOS 中无法实现退出功能。对于 Android,请使用 SystemNavigator.pop(...)【参考方案3】:

您可以使用SystemNavigator.pop() 来做到这一点。

【讨论】:

在 Android 和 iOS 上都没有发生任何事情。使用exit(0); 确实有效 在 iOS 上,SystemNavigator.pop 被忽略,因为 Apple 的人机界面指南规定应用程序不应自行退出。在 Android 上,它应该可以工作,并且优于调用 dart:io 的退出方法。考虑提出问题:github.com/flutter/flutter/issues/new 关于 iOS 的任何想法,我们如何在 Flutter 中做点什么? @iPatel 你可以在 iOS 上使用 exit(0),就是这样。 哟,但是拒绝呢;(正如你在上面的评论中所说的那样【参考方案4】:

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

如果您使用SystemChannels.platform.invokeMethod('SystemNavigator.pop');,请注意doc 明确提及:

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

在 iOS 上,对该方法的调用会被忽略,因为 Apple 的人工 接口指南声明应用程序不应退出 自己。

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

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

无论如何doc 也注意到SystemChannels.platform.invokeMethod('SystemNavigator.pop');

这个方法应该优于调用 dart:io 的退出方法,因为 后者可能会导致底层平台表现得好像 应用程序崩溃了。

所以,记住你在做什么。

【讨论】:

你写了这么多聪明的笔记,但是......如下所述以编程方式退出应用程序而不会在 iOS 中暂停的正确方法是什么? 为什么是SystemChannels.platform.invokeMethod('SystemNavigator.pop') 而不仅仅是SystemNavigator.pop(); @CsabaToth 都可以,使用invokeMethod 我们直接调用原生android pop 方法。当时我写的可能是flutter方法pop不存在。可能是SystemNavigator.pop();调用native方法退出(查看方法源码,我没有查看)。【参考方案5】:

您可以通过检查平台相关条件来调用它。为 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")
)

【讨论】:

【参考方案6】:

我更喜欢使用

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

虽然 exit(0) 也可以,但是应用突然关闭并且看起来不太好,有点像是应用崩溃了。

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

【讨论】:

【参考方案7】:

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

对于安卓:

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

对于 iOS:

无法关闭应用,但您可以使用 https://pub.dev/packages/minimize_app 将其移至后台,例如:

MinimizeApp.minimizeApp();

享受吧!

【讨论】:

【参考方案8】:

这对我有用;

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

【讨论】:

【参考方案9】:

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

      
    

【讨论】:

【参考方案10】:

您可以使用SystemNavigator.pop();AndroidiOS使用exit(0);

这里是例子-

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

别忘了在顶部导入import 'dart:io';

【讨论】:

【参考方案11】:

这对我有用。创建一个函数,并在您的 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();
   

【讨论】:

以上是关于Flutter 如何以编程方式退出应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式退出 Android 应用程序?

Flutter:如何使用 fcm 以编程方式发送推送通知

如何以编程方式退出或关闭 UWP 应用? (视窗 10)

优雅地退出资源管理器(以编程方式)

如何在iOS中以编程方式重新启动iPhone应用程序

Flutter:如何以编程方式添加 TextField 或 TextFormField