欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Flutter如何有效地退出程序

程序员文章站 2022-03-03 22:09:37
今天博主来谈一个开发Flutter App的小技巧——怎样有效地退出程序。这种方法典型的应用场景就是用户许可协议的同意与否。从用户的角度讲,虽然大部分人都会无脑点击“同意”,但我们仍不应忽视“不同意”的作用——退出App。笔者在网络上搜索了一下相关的API,发现大部分的文章都在推荐一种方法,即:SystemNavigator.pop();但该方法在iOS中并不适用。实际上,这种方法将会通知原生代码,请求原生代码退出App。换句话说,如果在原生层面并没有退出App的操作,就会报错。报错的示例如下:...

今天博主来谈一个开发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平台都是有效的。

本文地址:https://blog.csdn.net/wh1990xiao2005/article/details/108120387

相关标签: 跨平台开发