Flutter 之包管理、资源管理

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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容