加載 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)獲取BuildContext
的AssetBundle
, 這種方法不是使用應(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.png
是72px
乘72px
,那么.../3.0x/my_icon.png
應(yīng)該是216px
乘216px
睬塌, 但是如果未指定寬高泉蝌,它們都將渲染為72
像素×72
像素(以邏輯像素為單位)
pubspec.yaml
中asset
部分的每一項(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),例如ImageStream和ImageCache,你還會(huì)注意到與縮放有關(guān)的參數(shù)
Container(
child: Image(
image: AssetImage('assets/images/food02.jpeg'),
height: 300.0,
width: 300.0,
),
)
和平臺(tái)共享assets
通過(guò)Android
上的AssetManager
和iOS
上的NSBundle
硫兰,平臺(tái)代碼也隨時(shí)可以使用Flutter
資源诅愚。
android
android
上可以通過(guò)AssetManager獲取asset
, 例如使用openFd 根據(jù)key
查找劫映。
key
可以使用PluginRegistry.Registrar的lookupKeyForAsset
和FlutterView的getLookupKeyForAsset
獲得违孝, PluginRegistry.Registrar
在開(kāi)發(fā)插件的時(shí)候非常適用,而FlutterView
則在開(kāi)發(fā)包括平臺(tái)view
的app
時(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
可以使用FlutterPluginRegistrar的lookupKeyForAsset
和lookupKeyForAsset:fromPackage:
, 或者FlutterViewController的lookupKeyForAsset
和lookupKeyForAsset:fromPackage:
FlutterPluginRegistrar
在開(kāi)發(fā)插件的時(shí)候非常適用,而FlutterViewController
則在開(kāi)發(fā)包括平臺(tái)view
的app
時(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.xml
的application
標(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.png
,LaunchImage@2x.png
泵三,LaunchImage@3x.png
即可耕捞,如果要修改名字,則要更新Contents.json
也可以通過(guò)xcode
自定義啟動(dòng)頁(yè)