成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flutter 2 Router 從入門到放棄 - 基本使用、區別&優勢

開發 前端
Flutter 2 主要帶來的新特性有 Null 安全性趨于穩定,桌面和 Web 支持也正式宣布進入 stable 渠道,最受大家關注的就是 Add-to-App 相關的更新,從而改善 Flutter2 之前的版本混合開發體驗不好缺點。

[[414625]]

本文轉載自微信公眾號「微醫大前端技術」,作者周建華。轉載本文請聯系微醫大前端技術公眾號。

前言

Flutter 2 主要帶來的新特性有 Null 安全性趨于穩定,桌面和 Web 支持也正式宣布進入 stable 渠道,最受大家關注的就是 Add-to-App 相關的更新,從而改善 Flutter2 之前的版本混合開發體驗不好缺點。所謂的 Add-to-App 就是將 Flutter 添加到現有的 iOS 和 Android 應用程序中來利用 Flutter,在兩個移動平臺上復用 Flutter 代碼同時仍保留現有本機代碼庫的絕佳方法。在此方案出現之前,類似的第三方支持有 flutter_boost 、flutter_thrio 等,但是這些方案都要面對的問題是:非官方的支持必然存在每個版本需要適配的問題,而按照 Flutter 目前更新的速度,很可能每個季度的版本都存在較大的變動,所以如果開發者不維護或者維護不及時,那么侵入性極強的這類框架很容易就成為項目的瓶頸。

Flutter2 多引擎混合開發基本用法

1、先創建一個 Android 原生工程,( Android 原生項目工程創建過程略過)

2、Android 項目創建引入 Flutter Module,使用 File -> New- > New Module … -> 選擇 Flutter Module ,然后指定一個 module name,填寫相關息,最后點擊確定,等待 Gradle sync 完成。

3、Android 項目集成 Flutter Module

1)創建 FlutterEngineGroup 對象,FlutterEngineGroup 可以用來管理多個 FlutterEngine 對象,多個 FlutterEngine 之間是可以共享資源的,這樣多個 FlutterEngine 占用的資源相對會少一些,FlutterEngineGroup 需要在 Application onCreate 方法中創建。

  1. package com.zalex.hybird; 
  2.  
  3. import android.app.Application; 
  4. import io.flutter.embedding.engine.FlutterEngineGroup; 
  5.  
  6. public class WYApplication extends Application { 
  7.     public FlutterEngineGroup engineGroup; 
  8.     @Override 
  9.     public void onCreate() { 
  10.         super.onCreate(); 
  11.         // 創建 FlutterEngineGroup 對象 
  12.         engineGroup = new FlutterEngineGroup(this); 
  13.     } 

2)創建 WYFlutterEngineManager 緩存管理類,通過 FlutterEngineCache 緩存類,先從中獲取緩存的 FlutterEngine,如果沒有取到,通過 findAppBundlePath 和 entrypoint 創建出 DartEntrypoint 對象,這里的 findAppBundlePath 主要就是默認的 flutter_assets 目錄;而 entrypoint 其實就是 dart 代碼里啟動方法的名稱;也就綁定了在 dart 中 runApp 的方法,再通過 createAndRunEngine 方法創建一個 FlutterEngine,然后緩存起來。

  1. public class WYFlutterEngineManager { 
  2.     public static FlutterEngine flutterEngine(Context context, String engineId, String entryPoint) { 
  3.         // 1. 從緩存中獲取 FlutterEngine 
  4.         FlutterEngine engine = FlutterEngineCache.getInstance().get(engineId); 
  5.         if (engine == null) { 
  6.             // 如果緩存中沒有 FlutterEngine 
  7.             // 1. 新建 FlutterEngine,執行的入口函數是 entryPoint 
  8.            WYApplication app = (WYApplication) context.getApplicationContext(); 
  9.            DartExecutor.DartEntrypoint dartEntrypoint = new DartExecutor.DartEntrypoint(FlutterInjector.instance().flutterLoader().findAppBundlePath(), entryPoint); 
  10.            engine = app.engineGroup.createAndRunEngine(context, dartEntrypoint); 
  11.             // 2. 存入緩存 
  12.             FlutterEngineCache.getInstance().put(engineId, engine); 
  13.         } 
  14.         return engine; 
  15.     } 

Activity 綁定 flutter 引擎入口

  1. public class WYFlutterActivity extends FlutterActivity implements EngineBindingsDelegate { 
  2.     private WYFlutterBindings flutterBindings; 
  3.  
  4.     @Override 
  5.     protected void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { 
  6.         super.onCreate(savedInstanceState); 
  7.         flutterBindings = new WYFlutterBindings(this,SingleFlutterActivity.class.getSimpleName(),"main",this); 
  8.         flutterBindings.attach(); 
  9.     } 
  10.     @Override 
  11.     protected void onDestroy() { 
  12.         super.onDestroy(); 
  13.         flutterBindings.detach(); 
  14.     } 
  15.  
  16.     @Override 
  17.    public FlutterEngine provideFlutterEngine(@NonNull @NotNull Context context)  { 
  18.         return flutterBindings.getEngine(); 
  19.     } 
  20.  
  21.     @Override 
  22.     public void onNext() { 
  23.         Intent flutterIntent = new Intent(this, MainActivity.class); 
  24.         startActivity(flutterIntent); 
  25.     } 

Fragment 綁定 flutter 引擎入口

  1. int engineId = engineId ;//自定義引擎 Id 
  2. int fragmentId = 1233444;//自定義 FragmentId 
  3.  
  4. FrameLayout flutterContainer = new FrameLayout(this); 
  5. root.addView(flutterContainer); 
  6. flutterContainer.setId(containerId); 
  7. flutterContainer.setLayoutParams(new LinearLayout.LayoutParams( 
  8.         FrameLayout.LayoutParams.MATCH_PARENT, 
  9.         FrameLayout.LayoutParams.MATCH_PARENT, 
  10.         1.0f 
  11. )); 
  12.  
  13. WYFlutterBindings  flutterBindings = new WYFlutterBindings(this,"WYTopFragment","fragmentMain",this); 
  14.  
  15. FlutterEngine engine =  bottomBindings.getEngine(); 
  16.  
  17. FlutterEngineCache.getInstance().put(engineId+"", engine); 
  18. Fragment flutterFragment =FlutterFragment.withCachedEngine(engineId+"").build(); 
  19. fragmentManager 
  20.         .beginTransaction() 
  21.         .add(containerId, flutterFragment) 
  22.         .commit(); 

3)flutter 模塊引擎入口綁定,除了 main 入口,其他引擎入口都需要加上@pragma('vm:entry-point')注解

  1. void main() => runApp(MyApp(Colors.blue)); 
  2.  
  3. @pragma('vm:entry-point'
  4. void fragmentMain() => runApp(CustomApp(Colors.green)); 

Flutter2多引擎混合開發與單引擎混合開發比較

1、 Flutter 多引擎方案是 flutter api 一直都是可以支持的,可以創建多個引擎,也可以渲染多個不同的界面,也是獨立的,但是每次啟動一個 flutter 引擎,都會占一個獨立的引擎,通過測試可以發現,一個引擎 40M,創建 10 個引擎消耗了 235M,對內存的占用很大,在開發中是不可接受的。

2、由于 Flutter 2 之前版本多引擎的缺陷,業內的做法一般是對 isolate 或 engine 進行復用來解決。影響力較大的是以 FlutterBoost 和 Thrio 為代表的單引擎瀏覽器方案。即把 Activity/ViewController 作為承載 Dart 頁面的瀏覽器,在頁面切換時對單引擎進行 detach/attach,同時通知 Dart 層頁面切換,來實現 Engine 的復用。由于只持有了一個 Engine 單例,僅創建一份 isolate,Dart 層是通信和資源共享的,內存損耗也得以有顯著的降低。但是單引擎實現依賴于修改官方的 io.flutter 包,對 flutter 框架做出比較大的結構性修改。

3、從 Flutter 2 開始,多引擎下使用 FlutterEngineGroup 來創建新的 Engine,官方宣稱內存損耗僅占 180K,其本質是使 Engine 可以共享 GPU 上下文、字形和 isolate group snapshot,從而實現了更快的初始速度和更低的內存占用。

4、Flutter 2 與 Flutter 1 創建引擎的區別:

Flutter1 引擎創建

  1. //Android 
  2. val engine = FlutterEngine(this) 
  3. engine.dartExecutor.executeDartEntrypoin(DartExecutor.DartEntrypoint.createDefault()) 
  4. FlutterEngineCache.getInstance().put(1,engine) 
  5. val intent = FlutterActivity.withCacheEngine(1).build(this) 
  1. //iOS 
  2. let engine = FlutterEngine() 
  3. engine.run() 
  4. let vc = FlutterViewController(engine:engine,nibName:nil,bundle:nil) 

Fluter2 引擎創建

  1. //Android 
  2. val engineGroup = FlutterEngineGroup(context) 
  3. val engine1 = engineGroup.createAndRunDefaultEngine(context) 
  4. val engine2 = engineGroup.createAndRunEngine(context,DartExecutor.DartEntrypoint(FlutterInjector.instance().flutterLoader().findAppBundlePath(),"anotherEntrypoint")) 
  1. //iOS 
  2. let engineGroup = FlutterEngineGroup(name:"example",project:nil) 
  3. let engine1 = engineGroup.makeEngine(withEntrypoint:nil,libraryURI:nil) 
  4. let engine2 = engineGroup.makeEngine(withEntrypoint:"anotherEntrypoint",libraryURI:nil) 

5、Flutter 混合開發方案比較

6、Flutter 輕量級多引擎和單引擎優缺點比較

后記 

本文通過代碼和表格,我們講述了 Flutter 2 多引擎使用、多引擎混合開發與單引擎混合開發區別和優缺點比較,下一節我們將一起去學習 Flutter 2 多引擎的實現原理。

 

責任編輯:武曉燕 來源: 微醫大前端技術
相關推薦

2021-08-12 07:01:23

FlutterRouter Android

2019-07-02 14:17:18

API網關網關流量

2017-03-25 20:30:15

2017-12-25 11:15:06

JavaArray數組

2020-07-07 10:50:19

Python丄則表達文本

2025-04-22 02:00:00

芯片晶圓光刻機

2022-01-17 08:52:32

CPUCPU工具顯卡

2021-11-08 07:11:49

決策樹數據分類器

2016-08-03 16:01:47

GitLinux開源

2022-03-28 11:00:34

JVMJava對象

2017-01-09 09:34:03

Docker容器傳統虛擬機

2018-01-26 14:35:16

程序員入門經歷

2019-06-23 15:21:42

Google谷歌平板

2021-05-11 11:08:37

電腦病毒軟件

2022-04-19 11:25:31

JVMZGC垃圾收集器

2020-04-10 15:05:09

深度學習人工智能蒸餾

2021-02-06 22:10:12

宏定義處理器代碼

2021-10-15 22:19:15

電腦藍屏重啟

2022-04-21 08:20:33

CPU換蓋CPU

2021-10-25 05:54:59

SSD固態硬盤存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人网在线看 | 日韩欧美二区 | 亚洲在线免费 | 日本精品一区二区三区在线观看视频 | 久久久久久国产精品免费免费狐狸 | 中文字幕日韩欧美一区二区三区 | 日韩中文字幕免费 | 99热在线观看精品 | 午夜av电影院 | 日韩a视频| 色综合一区二区三区 | 波多野结衣在线观看一区二区三区 | avmans最新导航地址 | 色婷婷在线视频 | 亚洲午夜av久久乱码 | 香蕉视频黄色 | 成人在线精品视频 | 久久久青草 | 国产夜恋视频在线观看 | 日本黄色免费视频 | 久久久久久99 | 久久机热 | 日韩在线视频播放 | 蜜桃免费一区二区三区 | 91在线影院 | 国产黄色网 | 81精品国产乱码久久久久久 | 国产 91 视频| 欧美专区在线观看 | 亚洲精品一区在线 | 精品国产乱码久久久久久图片 | 在线观看毛片网站 | 日韩在线中文字幕 | 欧美老妇交乱视频 | 免费成人高清在线视频 | 久色网| 国产精品美女久久久 | 特黄色一级毛片 | 成人午夜毛片 | 亚洲国产二区 | 天天视频一区二区三区 |