flutter assets

加載 assets

應(yīng)用可以通過(guò)AssetBundle訪(fǎng)問(wèn)assets

有兩種方法可以加載字符串或者圖片慷蠕,只需要在pubspec.yaml中指定這些資源的路徑即可

加載文本

每個(gè)程序中都會(huì)有一個(gè)rootBunlde對(duì)象,可以很輕松的訪(fǎng)問(wèn)主資源包,可以直接使用package:flutter/services.dart中全局靜態(tài)rootBundle對(duì)象來(lái)加載assets

但是建議使用DefaultAssetBundle來(lái)獲取BuildContextAssetBundle, 這種方法不是使用應(yīng)用程序構(gòu)建的默認(rèn)asset bundle颓哮,而是使父widget在運(yùn)行時(shí)替換的不同的AssetBundle层亿,這對(duì)于本地化或者測(cè)試很有用幻馁。

通常提鸟,可以使用DefaultAssetBundle.of()從應(yīng)用運(yùn)行時(shí)的rootBundle加載asset(例如JSON文件)伏伐。

Widget上下文之外帕翻,或AssetBundle不可用時(shí)鸠补,可以使用rootBundle直接加載這些asset

例如:

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

Future<String> loadAsset() async {
  return await rootBundle.loadString('assets/config.json');
}

加載圖片

聲明圖片

flutter可以根據(jù)當(dāng)前設(shè)備的像素加載不同分辨率的圖片,AssetImage了解怎么根據(jù)設(shè)備的像素加載不同的圖片,只需要在pubspec.yaml中指定不同分辨率的圖片即可

 .../image.png
  .../Mx/image.png
  .../Nx/image.png
  ...etc.

M和N是數(shù)字標(biāo)識(shí)符,類(lèi)似于iOS中的那樣,

假如主要的資源對(duì)應(yīng)1.0分辨率的設(shè)備,那么考慮用以下命名方式指定assets

.../my_icon.png
  .../2.0x/my_icon.png
  .../3.0x/my_icon.png

在設(shè)備像素比例為1.8的設(shè)備上嘀掸,會(huì)選擇2.0x下的文件,對(duì)于2.7的比例設(shè)備上則會(huì)選擇3.0x下的問(wèn)題件

如果沒(méi)有在Image控件中指定圖片的寬高,則使用默認(rèn)分辨率來(lái)縮放資源紫岩,以便和主要資源占用相同的大小,只不過(guò)分辨率會(huì)更好,也就是說(shuō),如果.../my_icon.png72px72px,那么.../3.0x/my_icon.png應(yīng)該是216px216px睬塌, 但是如果未指定寬高泉蝌,它們都將渲染為72像素×72像素(以邏輯像素為單位)

pubspec.yamlasset部分的每一項(xiàng)都應(yīng)該與實(shí)際文件相對(duì)應(yīng),但主資源項(xiàng)除外,當(dāng)主資源缺少某個(gè)資源時(shí)揩晴,會(huì)按分辨率從低到高的順序去選擇

加載圖片

如果要加載圖片,請(qǐng)?jiān)?code>widget的build方法中使用AssetImage


如果使用默認(rèn)的assets bundle加載資源時(shí)勋陪,內(nèi)部會(huì)自動(dòng)處理分辨率,如果使用更低級(jí)別的類(lèi),例如ImageStreamImageCache,你還會(huì)注意到與縮放有關(guān)的參數(shù)

Container(
          child: Image(
            image: AssetImage('assets/images/food02.jpeg'),
            height: 300.0,
            width: 300.0,
          ),
        )

和平臺(tái)共享assets

通過(guò)Android上的AssetManageriOS上的NSBundle硫兰,平臺(tái)代碼也隨時(shí)可以使用Flutter資源诅愚。

android

android上可以通過(guò)AssetManager獲取asset, 例如使用openFd 根據(jù)key查找劫映。

key可以使用PluginRegistry.RegistrarlookupKeyForAssetFlutterViewgetLookupKeyForAsset獲得违孝, PluginRegistry.Registrar在開(kāi)發(fā)插件的時(shí)候非常適用,而FlutterView則在開(kāi)發(fā)包括平臺(tái)viewapp時(shí)非常適用

示例:

flutter:
  assets:
    - icons/heart.png

項(xiàng)目目錄:

  .../pubspec.yaml
  .../icons/heart.png
  ...etc.

如果想在插件中訪(fǎng)問(wèn)heart.png,則可以

AssetManager assetManager = registrar.context().getAssets();
String key = registrar.lookupKeyForAsset("icons/heart.png");
AssetFileDescriptor fd = assetManager.openFd(key);

ios

ios中,assets可以使用mainbundle獲取泳赋, 例如使用 pathForResource:ofType: 根據(jù)key查找雌桑。

key可以使用FlutterPluginRegistrarlookupKeyForAssetlookupKeyForAsset:fromPackage:, 或者FlutterViewControllerlookupKeyForAssetlookupKeyForAsset:fromPackage: FlutterPluginRegistrar在開(kāi)發(fā)插件的時(shí)候非常適用,而FlutterViewController則在開(kāi)發(fā)包括平臺(tái)viewapp時(shí)非常適用

android示例相同,ios獲取則可以

NSString* key = [registrar lookupKeyForAsset:@"icons/heart.png"]; 
NSString* path = [[NSBundle mainBundle] pathForResource:key ofType:nil];

更完整的示例,請(qǐng)查看Flutter video_payer插件的實(shí)現(xiàn)祖今。

使用平臺(tái)資源

有時(shí)候可以直接在平臺(tái)項(xiàng)目中使用asset校坑。以下是在Flutter框架加載并運(yùn)行之前使用資源的兩種常見(jiàn)情況

更新app圖標(biāo)

android

導(dǎo)航到.../android/app/src/main/res目錄,mipmap-開(kāi)頭的各種文件夾放置的就是不同分辨率的圖標(biāo),如果想替換,根據(jù)Android開(kāi)發(fā)人員指南 替換相應(yīng)的圖片即可

注:

如果想重命名圖標(biāo),記得要在AndroidManifest.xmlapplication標(biāo)簽中替換修改后的名稱(chēng)

ios

導(dǎo)航到.../ios/Runner,該目錄中的Assets.xcassets/AppIcon.appiconset已經(jīng)包含了占位符圖片千诬,只需要根據(jù)ios開(kāi)發(fā)人員指南 將它們替換為適當(dāng)大小的圖像即可耍目,

更新啟動(dòng)頁(yè)

flutter加載時(shí),flutter也使用本地平臺(tái)機(jī)制將過(guò)渡啟動(dòng)屏幕繪制到flutter應(yīng)用程序,此啟動(dòng)屏幕將持續(xù)到flutter渲染應(yīng)用程序的第一幀

也就意味著只要不調(diào)用void main(),屏幕將會(huì)一直顯示啟動(dòng)頁(yè)

android

導(dǎo)航到.../android/app/src/main大渤,在res/drawable/launch_background.xml中已經(jīng)有一個(gè)示例,根據(jù)示例可以自定義啟動(dòng)頁(yè)

使用者可以通過(guò)LayerList自定義啟動(dòng)頁(yè),也可以使用其他drawable

ios

導(dǎo)航至.../ios/Runner,在Assets.xcassets/LaunchImage.imageset制妄,替換LaunchImage.pngLaunchImage@2x.png泵三,LaunchImage@3x.png即可耕捞,如果要修改名字,則要更新Contents.json

也可以通過(guò)xcode自定義啟動(dòng)頁(yè)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衔掸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俺抽,更是在濱河造成了極大的恐慌敞映,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,496評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷斧,死亡現(xiàn)場(chǎng)離奇詭異振愿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弛饭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)冕末,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人侣颂,你說(shuō)我怎么就攤上這事档桃。” “怎么了憔晒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,091評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵藻肄,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拒担,道長(zhǎng)嘹屯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,458評(píng)論 1 283
  • 正文 為了忘掉前任从撼,我火速辦了婚禮州弟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谋逻。我一直安慰自己呆馁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布毁兆。 她就那樣靜靜地躺著浙滤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪气堕。 梳的紋絲不亂的頭發(fā)上纺腊,一...
    開(kāi)封第一講書(shū)人閱讀 49,802評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音茎芭,去河邊找鬼揖膜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梅桩,可吹牛的內(nèi)容都是我干的壹粟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,945評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宿百,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趁仙!你這毒婦竟也來(lái)了洪添?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,709評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雀费,失蹤者是張志新(化名)和其女友劉穎干奢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盏袄,經(jīng)...
    沈念sama閱讀 44,158評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忿峻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辕羽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逛尚。...
    茶點(diǎn)故事閱讀 38,637評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逛漫,靈堂內(nèi)的尸體忽然破棺而出黑低,到底是詐尸還是另有隱情赘艳,我是刑警寧澤酌毡,帶...
    沈念sama閱讀 34,300評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蕾管,受9級(jí)特大地震影響枷踏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掰曾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評(píng)論 3 313
  • 文/蒙蒙 一旭蠕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旷坦,春花似錦掏熬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,744評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捆蜀,卻和暖如春疮丛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辆它。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,982評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工誊薄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锰茉。 一個(gè)月前我還...
    沈念sama閱讀 46,344評(píng)論 2 360
  • 正文 我出身青樓呢蔫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親飒筑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片吊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一昙衅、初識(shí)flutter image 在講解源碼之前,我們先看下面幾個(gè)例子定鸟,回顧一下flutter加載圖片資源的方式...
    五月_f6d4閱讀 11,182評(píng)論 3 23
  • 前言 一個(gè)應(yīng)用程序主要由兩部分內(nèi)容組成:代碼和資源而涉。代碼關(guān)注邏輯功能,而如圖片联予、字符串啼县、字體、配置文件等資源則關(guān)注...
    Eren丶耶格爾閱讀 8,169評(píng)論 0 6
  • 我覺(jué)得自己還是太負(fù)能了沸久〖揪欤總發(fā)這種無(wú)意義的顧影自憐也不好。想想還是發(fā)一些學(xué)習(xí)打卡監(jiān)督自己吧卷胯。 2018.12.13 ...
    dustcellar閱讀 132評(píng)論 0 0
  • 學(xué)習(xí)問(wèn)題可以說(shuō)對(duì)我們很多有孩子家庭都是一大考驗(yàn)子刮,孩子成績(jī)好的,家庭就和睦的多窑睁;孩子成績(jī)不好的挺峡,不僅父母和孩子之間常...
    路姐說(shuō)閱讀 354評(píng)論 0 0
  • 初次來(lái)陜南,初次遇見(jiàn)漢中担钮。 還記得以前語(yǔ)文課本中要求背的這篇課文不橱赠? 初次遇見(jiàn)漢中,接觸的竟然是以前課本中的《出師...
    zheng小葉閱讀 3,318評(píng)論 0 6