美文网首页编程二三事
Flutter如何有效地退出程序

Flutter如何有效地退出程序

作者: 萧文翰 | 来源:发表于2020-08-20 11:48 被阅读0次

    今天博主来谈一个开发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.<init>(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.<init>(VirtualDisplayController.java:93)
    E/WindowManager( 7144): at io.flutter.plugin.platform.VirtualDisplayController.create(VirtualDisplayController.java:53)
    E/WindowManager( 7144): at io.flutter.plugin.platform.PlatformViewsController1.createPlatformView(PlatformViewsController.java:105) E/WindowManager( 7144): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel1.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如何有效地退出程序

        本文链接:https://www.haomeiwen.com/subject/anesjktx.html