1、包管理
1、简介
Android 通过 Gradle 来管理依赖,iOS 用 Cocoapods 或 Carthage 来管理依赖,Node 中通过 npm 等。在 Flutter 开发中也有自己的包管理工具,用配置文件 pubspec.yaml(位于项目根目录)来管理第三方依赖包。
YAML 是一种直观、可读性高文件格式,和 xml 或 Json 相比它语法简单并非常容易解析,所以 YAML 常用于配置文件,Flutter 也是用 yaml 文件作为其配置文件。Flutter 项目默认的配置文件是 pubspec.yaml。
示例:
name: flutter_in_action
description: First Flutter Application.
version: 1.0.0+1
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
解析:
name:应用或包名称。
description: 应用或包的描述、简介。
version:应用或包的版本号。
dependencies:应用或包依赖的其他包或插件。依赖包将作为 App 的源码的一部分参与编译,生成最终的安装包。
dev_dependencies:开发环境依赖的工具包(而不是 flutter 应用本身依赖的包)。依赖包只是作为开发阶段的一些工具包,主要是用于帮助我们提高开发、测试效率,比如 flutter 的自动化测试包等。
flutter:flutter 相关的配置选项。
2、添加依赖包
Pub 仓库
Pub(https://pub.dev/ )是 Google 官方的 Dart Packages 仓库,类似于 node 中的 npm 仓库、Android 中的 jcenter。
示例
english_words
:实现一个显示随机字符串的 widget。
1、添加到依赖项列表
dependencies:
flutter:
sdk: flutter
# 新添加的依赖
english_words: ^4.0.0
2、下载包
flutter pub get
或
flutter pub upgrade
3、添加其他方式的依赖包
本地依赖包:
dependencies:
pkg1:
path: ../../code/pkg1
Git 依赖包:绝对路径
dependencies:
pkg1:
git:
url: git://github.com/xxx/pkg1.git
Git 依赖包:相对路径
dependencies:
package1:
git:
url: git://github.com/flutter/packages.git
path: packages/package1
2、资源管理
Flutter APP 安装包中会包含源码和 Assets(资源)两部分。Assets 会打包到程序安装包中,可在运行时访问。常见类型的 Assets 包括静态数据(例如 JSON 文件)、配置文件、图标和图片等。
1、Assets
Flutter 使用 pubspec.yaml 文件来管理应用程序所需的资源。示例如下:
flutter:
assets:
- images/my_icon.png
- images/background.png
释义:图片在 images 文件夹中
2、加载 Assets
加载文本
1、通过 rootBundle
对象加载:每个 Flutter 应用程序都有一个 rootBundle
对象, 通过它可以轻松访问主资源包,直接使用 package:flutter/services.dart
中全局静态的 rootBundle
对象来加载 Assets 即可。
2、通过 DefaultAssetBundle
加载:建议使用 DefaultAssetBundle
来获取当前 BuildContext 的 AssetBundle。 这种方法不是使用应用程序构建的默认 asset bundle,而是使父级 widget 在运行时动态替换的不同的 AssetBundle。
通常,可以使用 DefaultAssetBundle.of()
在应用运行时来间接加载 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');
}
加载图片
1、图片分辨率
AssetImage 可以将 asset 的请求逻辑映射到最接近当前设备像素比例(dpi)的 asset。为了使这种映射起作用,必须根据特定的目录结构来保存asset。
…/image.png
…/Mx/image.png
…/Nx/image.png
M 和 N 代表数字,如:2.0 和 3.0,即 1 倍,2 倍,3 倍图
…
如果未在 Image widget 上指定渲染图像的宽度和高度,那么 Image widget 将占用与主资源相同的屏幕空间大小。
pubspec.yaml 中 asset 部分中的每一项都应与实际文件相对应,但主资源项除外。当主资源缺少某个资源时,会按分辨率从低到高的顺序去选择 。
2、加载图片
要加载图片,可以使用 AssetImage
类。
Widget build(BuildContext context) {
return DecoratedBox(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('graphics/background.png'),
),
),
);
}
也可以使用
Widget build(BuildContext context) {
return Image.asset('graphics/background.png');
}
3、使用依赖包中的资源
例:假设应用程序依赖于一个名为 my_icons
的包,它具有一个 …/icons/heart.png。
AssetImage('icons/heart.png', package: 'my_icons')
或
Image.asset('icons/heart.png', package: 'my_icons')
3、特定 assets
设置 APP 图标:更新 Flutter 应用程序启动图标的方式与在 Android 或 iOS 应用程序中更新启动图标的方式相同。
Android
:在 Flutter 项目的根目录 .../android/app/src/main/res
中,里面包含了各种资源文件夹(如:mipmap-hdpi
已包含占位符图像 ic_launcher.png
),替换该图片即可。
iOS
:在 Flutter 项目的根目录 .../iOS/Runner
中。该目录中 Assets.xcassets/AppIcon.appiconset
已经包含占位符图片, 只需将它们替换为适当大小的图片,保留原始文件名称。
更新启动图:
在 Flutter 框架加载时,Flutter 会使用本地平台机制绘制启动页,启动页将持续到 Flutter 渲染应用程序的第一帧。也就是说如果不在应用程序的 main()
方法中调用 runApp
函数或者更具体地说,如果不调用 window.render
去响应 window.onDrawFrame
的话, 启动屏幕将永远持续显示。
Android
:把启动图添加到 .../android/app/src/main/res/drawable/launch_background.xml
中,直接修改新加入的图片名即可。也可以通过自定义 drawable 来实现自定义启动界面。
iOS
:把启动图添加到 .../iOS/Runner/Assets.xcassets/LaunchImage.imageset
中,并命名为 LaunchImage.png、LaunchImage@2x.png、LaunchImage@3x.png。 若使用不同的文件名,则必须更新同一目录中的 Contents.json 文件。
4、平台共享 assets
如果项目采用的是 Flutter+原生
的开发模式,那么可能会存在 Flutter 和原生需要共享资源的情况,比如图片。可以在 flutter 和原生中各加一份图片资源来实现(包比较大),也可以通过直接读取 flutter 资源的方式实现。不同平台读取的方式不同, Android 是通过 AssetManager,iOS 是 NSBundle。
示例:假设在 Flutter 的 pubspec.yaml 中有以下资源文件:
flutter:
assets:
- icons/heart.png
Android 加载 Flutter 中的资源文件:
AssetManager assetManager = registrar.context().getAssets();
String key = registrar.lookupKeyForAsset("icons/heart.png");
AssetFileDescriptor fd = assetManager.openFd(key);
iOS 加载 Flutter 中的资源文件:
//OC
NSString* key = [registrar lookupKeyForAsset:@"icons/heart.png"];
NSString* path = [[NSBundle mainBundle] pathForResource:key ofType:nil];
//Swift
let key = controller.lookupKey(forAsset: "icons/heart.png")
let mainBundle = Bundle.main
let path = mainBundle.path(forResource: key, ofType: nil)