Flutter如何有效地退出程序
今天博主来谈一个开发Flutter App的小技巧——怎样有效地退出程序。
这种方法典型的应用场景就是用户许可协议的同意与否。从用户的角度讲,虽然大部分人都会无脑点击“同意”,但我们仍不应忽视“不同意”的作用——退出App。
笔者在网络上搜索了一下相关的API,发现大部分的文章都在推荐一种方法,即:
SystemNavigator.pop();
但该方法在iOS中并不适用。
实际上,这种方法将会通知原生代码,请求原生代码退出App。换句话说,如果在原生层面并没有退出App的操作,就会报错。报错的示例如下:
android.view.WindowLeaked: Activity com.test.MainActivity has leaked window DecorView@855ee8b[] that was originally added here
E/WindowManager( 7144): at android.view.ViewRootImpl.(ViewRootImpl.java:558)
E/WindowManager( 7144): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
E/WindowManager( 7144): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97)
E/WindowManager( 7144): at android.app.Dialog.show(Dialog.java:538)
E/WindowManager( 7144): at android.app.Presentation.show(Presentation.java:252)
E/WindowManager( 7144): at io.flutter.plugin.platform.VirtualDisplayController.(VirtualDisplayController.java:93)
E/WindowManager( 7144): at io.flutter.plugin.platform.VirtualDisplayController.create(VirtualDisplayController.java:53)
E/WindowManager( 7144): at io.flutter.plugin.platform.PlatformViewsController$1.createPlatformView(PlatformViewsController.java:105)
E/WindowManager( 7144): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.create(PlatformViewsChannel.java:96)
E/WindowManager( 7144): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.onMethodCall(PlatformViewsChannel.java:60)
好在默认情形下,原生层面已经做好了退出App的逻辑。
另一方面,根据iOS App的官方设计指导,App并不能自己结束自己,因此该方法并不适用iOS。
如果我们确实有退出程序的需求呢?
解决方法其实很简单,只要执行:
exit(0);
即可。
但是,直接调用exit()方法将会导致Dart虚拟机立即终止运行。其结果将导致:任何未终止的异步线程将会立即停止,Android平台原生的退出逻辑也会被跳过。
但是,如果没有这些顾虑,完全可以使用这种方式,它对Android和iOS平台都是有效的。
Flutter如何有效地退出程序的更多相关文章
- Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序
如需转载,请注明出处:Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序 在实际开发中,为了防止用户误触返回按钮导致程序退出,通常会设置为在1秒内连 ...
- flutter 返回键监听
本篇为继上片监听返回键基础下优化: 以下做返回键监听两种情况: import 'package:fluttertoast/fluttertoast.dart'; //提示第三方插件 1. 单击提示双击 ...
- flutter 监听返回键
### 监听手机返回键(双击退出) ``` import 'package:fluttertoast/fluttertoast.dart'; //提示插件 class WillPopScopeTest ...
- Flutter路由导航Navigator
第一点:push使用 1.pushNamed——Navigator.of(context).pushNamed('routeName'); 此种方法只是简单的将我们需要进入的页面push到栈顶,以此来 ...
- Flutter学习一
包管理 依赖本地包 dependencies: pkg1: path: ../../code/pkg1 依赖git包 dependencies: pkg1: git: url: git://githu ...
- flutter捕获应用退出弹出对话框
使用WillPopScope组件,它会检测到子组件的Navigation的pop事件,并拦截下来.我们需要在它的onWillPop属性中返回一个新的组件(一般是一个Dialog)处理是否真的pop该页 ...
- 青峰Flutter视频播放软件
下载地址: https://github.com/patton88/peak_flutter_player/raw/master/peak_flutter_player_v1.1.5_release0 ...
- Android 双击 Back 键退出程序
双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出). ================ ...
- C# 退出程序
1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit(); 强制所有消息中 ...
- android 双击返回按钮退出程序。
重写 onKeyDown()方法. @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == K ...
随机推荐
- python之特殊属性和特殊方法
目录 特殊属性 __dict__查看属性和方法 __class__查看对象所属类 __bases__查看子类的父类 __mro__查看类的层次结构 __subclasses__查看父类被继承的子类 特 ...
- 小米二面:Redis 如何保证数据不丢失?
前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候,我发现了一个问题,回答的不是很好,也就是我们今天要聊的这个问题:Redis 如何保证数据不丢失? 很多人 ...
- Kubernetes 漫游:kube-scheduler
概述 什么是 kube-scheduler ? Kubernetes 集群的核心组件之一,它负责为新创建的 Pods 分配节点.它根据多种因素进行决策,包括: 资源需求和限制:考虑每个 Pod 请求的 ...
- 单元测试平台搭建:sonarQube+sonarScanner+Jenkins+jacoco
单元测试平台搭建及结果分析 一.方案 需求目标:提高单元测试覆盖率和规范代码编写规范 选用工具:Sonarqube.sonarqube Scanner.Jenkins.jacoco 方案: 工程中引入 ...
- 87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验
瞬间爆火的Mixtral 8x7B 大家好,我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了,火爆程度压过Google的Gemini. 缘起是MistralAI ...
- 香橙派5plus从ssd启动Ubuntu
官方接口图 我实际会用到的就几个接口,背面的话就一个M.2固态的位置: 其中WIFI模块的接口应该也可以插2230的固态,不过是pcie2.0的速度,背面的接口则是pcie3.0*4的速度,差距还是挺 ...
- ElasticSearch之cat allocation API
查看各节点上各个shard的硬件使用情况,命令样例如下: curl -X GET "https://localhost:9200/_cat/allocation?v=true&pre ...
- 编写.NET的Dockerfile文件构建镜像
创建一个WebApi项目,并且创建一个Dockerfile空文件,添加以下代码,7.0代表的你项目使用的SDK的版本,构建的时候也需要选择好指定的镜像tag FROM mcr.microsoft.co ...
- Python——第二章:range()的用法:
在Python中,range()是一个内置函数,用于生成一个整数序列,通常用于循环遍历.以下是range()函数的一些常见用法: range(n): 从0数到n. 不包含nrange(m, n): 从 ...
- 终于肝完了!全网最全、最详细、最全面的 Hadoop大数据学习教程( 2023最新版 )
大家好,我是民工哥! 前面给大家介绍了:关系型数据库 MySQL . NoSQL 数据库 Redis . MongoDB .搜索引擎 ElasticSearch 等知识体系学习的文章. 在当今这样的就 ...