【Flutter 專(zhuān)題】59 圖解 Android Native 獲取 Flutter 資源文件

      網(wǎng)友投稿 1083 2025-03-31

      小菜前段時(shí)間研究了 Android Native 與 flutter 之間的交互;若兩端均需要相同資源文件,若不能共享則勢(shì)必會(huì)增加整體包大小;今天小菜研究一下如何通過(guò) Android Native 獲取 flutter 中資源文件;


      官網(wǎng)對(duì)于 assets 介紹很簡(jiǎn)潔,使用過(guò)程代碼量也很少,雖簡(jiǎn)潔但依然值得研究;小菜以 Android 為主工程,F(xiàn)lutter 作為 Module 進(jìn)行測(cè)試;

      FlutterView

      小菜學(xué)習(xí) Android 與 Flutter 交互時(shí)會(huì)用到 FlutterView 作為橋接控件;而對(duì)于資源文件的獲取也同樣適用;其核心方法是 getLookupKeyForAsset;

      逐層分析源碼,通過(guò) getLookupKeyForAsset 方法我們可以獲取資源文件的路徑,根目錄是固定的 flutter_assets 而非 Module 名;

      public String getLookupKeyForAsset(String asset) { return FlutterMain.getLookupKeyForAsset(asset); } public static String getLookupKeyForAsset(String asset) { return fromFlutterAssets(asset); } private static String fromFlutterAssets(String filePath) { return sFlutterAssetsDir + File.separator + filePath; } private static String sFlutterAssetsDir = "flutter_assets";

      小菜通過(guò) getLookupKeyForAsset 獲取文件路徑,以 images/ic_launcher.png 圖片為例,借助 assetManager.open 轉(zhuǎn)為流信息轉(zhuǎn)為 Bitmap 進(jìn)行展示;

      // 文件路徑:flutter_assets/images/ic_launcher.png try { AssetManager assetManager = getAssets(); InputStream is = assetManager.open(flutterView.getLookupKeyForAsset("images/ic_launcher.png")); Bitmap bitmap = BitmapFactory.decodeStream(is); flutterIv.setImageBitmap(bitmap); } catch (Exception e) { System.out.println("異常信息:" + e.toString()); }

      小菜測(cè)試可以用如下方式獲取資源文件路徑;

      // Activity flutterView.getLookupKeyForAsset("images/ic_launcher.png"); // Fragment (FlutterView) getView().getLookupKeyForAsset("images/ic_launcher.png"); // 通用 FlutterMain.getLookupKeyForAsset("images/ic_launcher.png");

      PluginRegistry.Registrar

      另一種常用的方式是以插件方式,F(xiàn)lutter 在使用 AndroidView 方式嵌入 Native View 與 Android 進(jìn)行交互時(shí);核心方法同樣是 lookupKeyForAsset 獲取資源路徑,之后便是用原生方法解析 assets 資源文件;

      小菜測(cè)試時(shí)主要注意兩點(diǎn):

      【Flutter 專(zhuān)題】59 圖解 Android Native 獲取 Flutter 資源文件

      獲取 PluginRegistry.Registrar,不能直接 new 對(duì)象,需要注冊(cè)自定義 Native View;

      在獲取文件路徑后嘗試了 AssetFileDescriptor 方式解析數(shù)據(jù)流,完全可以用于 assetManager.open 方式解析;

      // 文件路徑:flutter_assets/images/ic_launcher.png // Flutter 端 Container( child: AndroidView( viewType: "com.ace.ace_demo01/method_layout", creationParamsCodec: const StandardMessageCodec(), creationParams: {'method_layout_size': 450}), color: Colors.greenAccent, height: 200.0) // Android 端 final String key = "NMethodLayout"; if (this.hasPlugin(key)) return; PluginRegistry.Registrar registrar = this.registrarFor(key); registrar.platformViewRegistry() .registerViewFactory("com.ace.ace_demo01/method_layout", new NMethodLayoutFactory(registrar.messenger())); try { AssetManager assetManager = registrar.context().getAssets(); String assetKey = registrar.lookupKeyForAsset("images/ic_launcher.png"); AssetFileDescriptor fileDescriptor = assetManager.openFd(assetKey); Bitmap bitmap = BitmapFactory.decodeStream(fileDescriptor.createInputStream()); mIv.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); }

      注意事項(xiàng)

      無(wú)論是 FlutterView 還是 PluginRegistry.Registrar 方式均需 lookupKeyForAsset 獲取 Flutter 端資源文件路徑,且獲取類(lèi)型與原生 assets 中一致;小菜測(cè)試獲取一個(gè) json 文件進(jìn)行解析;

      final String key = "NMethodLayout"; if (this.hasPlugin(key)) return; PluginRegistry.Registrar registrar = this.registrarFor(key); registrar.platformViewRegistry() .registerViewFactory("com.ace.ace_demo01/method_layout", new NMethodLayoutFactory(registrar.messenger())); try { AssetManager assetManager = registrar.context().getAssets(); Log.e("===getJson===", getJson(registrar.lookupKeyForAsset("images/star.json"))); } catch (Exception e) { e.printStackTrace(); } public String getJson(String fileName) { StringBuilder stringBuilder = new StringBuilder(); try { //獲取assets資源管理器 AssetManager assetManager = getAssets(); //通過(guò)管理器打開(kāi)文件并讀取 InputStreamReader inputReader = new InputStreamReader( assetManager.open(fileName) ); BufferedReader bufReader = new BufferedReader(inputReader); String line="", result=""; while((line = bufReader.readLine()) != null) result += line; return result; } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } // ===getJson===: { "stars": [ { "name": "水瓶座", "name_en": "Aquarius" }, { "name": "雙魚(yú)座", "name_en": "Pisces" }, { "name": "白羊座", "name_en": "Aries" }, { "name": "金牛座", "name_en": "Taurus" }, { "name": "雙子座", "name_en": "Gemini" }, { "name": "巨蟹座", "name_en": "Cancer" }, { "name": "獅子座", "name_en": "Leo" }, { "name": "處女座", "name_en": "Virgo" }, { "name": "天秤座", "name_en": "Libra" }, { "name": "天蝎座", "name_en": "Scorpio" }, { "name": "射手座", "name_en": "Sagittarius" }, { "name": "摩羯座", "name_en": "Capricorn" } ]}

      小菜還未成功嘗試 Flutter 獲取 Native 的資源文件,依舊是從零探索中;如有錯(cuò)誤請(qǐng)多多指導(dǎo)!

      來(lái)源: 阿策小和尚

      Android Flutter iOS

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:大數(shù)據(jù)技術(shù)與應(yīng)用復(fù)習(xí)篇
      下一篇:【小資說(shuō)庫(kù)】第10期 數(shù)據(jù)庫(kù)事務(wù)的隔離性保證機(jī)制-事務(wù)隔離級(jí)別底層的控制機(jī)制。
      相關(guān)文章
      亚洲精品日韩专区silk| 亚洲最大的成网4438| 亚洲国产日韩在线一区| 亚洲欧洲日韩不卡| 亚洲国产一区在线| 亚洲天堂视频在线观看| 亚洲av激情无码专区在线播放| 亚洲成AV人在线播放无码 | 亚洲国产精品久久久天堂| 亚洲午夜久久久久妓女影院| 一本色道久久综合亚洲精品| 亚洲日韩精品一区二区三区无码| 亚洲综合日韩久久成人AV| 亚洲精品无码不卡在线播HE| 日本亚洲欧洲免费天堂午夜看片女人员| 亚洲老妈激情一区二区三区| 亚洲成A人片777777| 噜噜噜亚洲色成人网站∨| 亚洲成a人片在线观看播放| 亚洲av无码一区二区三区天堂古代 | 亚洲AV无码专区国产乱码4SE| 亚洲成年人在线观看| 久久亚洲AV成人无码软件| 亚洲精品影院久久久久久| 亚洲一级黄色大片| 亚洲日韩精品A∨片无码加勒比| 亚洲av无码片vr一区二区三区| 亚洲成?v人片天堂网无码| 国产亚洲一区区二区在线| 亚洲成AV人片在线观看无码| 久久精品亚洲一区二区三区浴池 | 亚洲日韩人妻第一页| 亚洲精品无码午夜福利中文字幕| 亚洲VA中文字幕无码毛片| 久久亚洲私人国产精品vA | 国产亚洲?V无码?V男人的天堂| 国产亚洲精AA在线观看SEE| 久久亚洲日韩看片无码| 亚洲中文字幕乱码AV波多JI| 成人伊人亚洲人综合网站222| 最新亚洲成av人免费看|