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

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

【问题讨论】:

    标签: flutter dart


    【解决方案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();
                   }
                }
                

                【讨论】:

                  猜你喜欢
                  • 2011-10-22
                  • 2023-03-29
                  • 2011-09-13
                  • 2011-02-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多