加載 assets
應用可以通過AssetBundle訪問assets
有兩種方法可以加載字符串或者圖片,只需要在pubspec.yaml
中指定這些資源的路徑即可
加載文本
每個程序中都會有一個rootBunlde對象,可以很輕松的訪問主資源包,可以直接使用package:flutter/services.dart
中全局靜態rootBundle
對象來加載assets
但是建議使用DefaultAssetBundle來獲取BuildContext
的AssetBundle
, 這種方法不是使用應用程序構建的默認asset bundle
,而是使父widget
在運行時替換的不同的AssetBundle
,這對于本地化或者測試很有用。
通常,可以使用DefaultAssetBundle.of()
從應用運行時的rootBundle
加載asset
(例如JSON
文件)。
在Widget
上下文之外,或AssetBundle
不可用時,可以使用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
可以根據當前設備的像素加載不同分辨率的圖片,AssetImage了解怎么根據設備的像素加載不同的圖片,只需要在pubspec.yaml
中指定不同分辨率的圖片即可
.../image.png
.../Mx/image.png
.../Nx/image.png
...etc.
M和N是數字標識符,類似于iOS中的那樣,
假如主要的資源對應1.0分辨率的設備,那么考慮用以下命名方式指定assets
.../my_icon.png
.../2.0x/my_icon.png
.../3.0x/my_icon.png
在設備像素比例為1.8
的設備上,會選擇2.0x
下的文件,對于2.7
的比例設備上則會選擇3.0x
下的問題件
如果沒有在Image
控件中指定圖片的寬高,則使用默認分辨率來縮放資源,以便和主要資源占用相同的大小,只不過分辨率會更好,也就是說,如果.../my_icon.png
是72px
乘72px
,那么.../3.0x/my_icon.png
應該是216px
乘216px
, 但是如果未指定寬高,它們都將渲染為72
像素×72
像素(以邏輯像素為單位)
pubspec.yaml
中asset
部分的每一項都應該與實際文件相對應,但主資源項除外,當主資源缺少某個資源時,會按分辨率從低到高的順序去選擇
加載圖片
如果要加載圖片,請在widget
的build
方法中使用AssetImage
如果使用默認的assets bundle
加載資源時,內部會自動處理分辨率,如果使用更低級別的類,例如ImageStream和ImageCache,你還會注意到與縮放有關的參數
Container(
child: Image(
image: AssetImage('assets/images/food02.jpeg'),
height: 300.0,
width: 300.0,
),
)
和平臺共享assets
通過Android
上的AssetManager
和iOS
上的NSBundle
,平臺代碼也隨時可以使用Flutter
資源。
android
android
上可以通過AssetManager獲取asset
, 例如使用openFd 根據key
查找。
key
可以使用PluginRegistry.Registrar的lookupKeyForAsset
和FlutterView的getLookupKeyForAsset
獲得, PluginRegistry.Registrar
在開發插件的時候非常適用,而FlutterView
則在開發包括平臺view
的app
時非常適用
示例:
flutter:
assets:
- icons/heart.png
項目目錄:
.../pubspec.yaml
.../icons/heart.png
...etc.
如果想在插件中訪問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: 根據key
查找。
key
可以使用FlutterPluginRegistrar的lookupKeyForAsset
和lookupKeyForAsset:fromPackage:
, 或者FlutterViewController的lookupKeyForAsset
和lookupKeyForAsset:fromPackage:
FlutterPluginRegistrar
在開發插件的時候非常適用,而FlutterViewController
則在開發包括平臺view
的app
時非常適用
和android
示例相同,ios
獲取則可以
NSString* key = [registrar lookupKeyForAsset:@"icons/heart.png"];
NSString* path = [[NSBundle mainBundle] pathForResource:key ofType:nil];
更完整的示例,請查看Flutter video_payer插件的實現。
使用平臺資源
有時候可以直接在平臺項目中使用asset
。以下是在Flutter
框架加載并運行之前使用資源的兩種常見情況
更新app圖標
android
導航到.../android/app/src/main/res
目錄,mipmap-
開頭的各種文件夾放置的就是不同分辨率的圖標,如果想替換,根據Android開發人員指南 替換相應的圖片即可
注:
如果想重命名圖標,記得要在AndroidManifest.xml
的application
標簽中替換修改后的名稱
ios
導航到.../ios/Runner
,該目錄中的Assets.xcassets/AppIcon.appiconset
已經包含了占位符圖片,只需要根據ios開發人員指南 將它們替換為適當大小的圖像即可,
更新啟動頁
在flutter
加載時,flutter
也使用本地平臺機制將過渡啟動屏幕繪制到flutter
應用程序,此啟動屏幕將持續到flutter
渲染應用程序的第一幀
也就意味著只要不調用void main()
,屏幕將會一直顯示啟動頁
android
導航到.../android/app/src/main
,在res/drawable/launch_background.xml
中已經有一個示例,根據示例可以自定義啟動頁
使用者可以通過LayerList自定義啟動頁,也可以使用其他drawable
ios
導航至.../ios/Runner
,在Assets.xcassets/LaunchImage.imageset
,替換LaunchImage.png
,LaunchImage@2x.png
,LaunchImage@3x.png
即可,如果要修改名字,則要更新Contents.json
也可以通過xcode
自定義啟動頁