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平台都是有效的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM