资源管理

而在 Flutter 中,资源管理则简单得多:资源(assets)可以是任意类型的文件,比如 JSON 配置文件或是字体文件等,而不仅仅是图片。

  • 把资源存放在项目中的任意目录下,只需要使用根目录下的 pubspec.yaml 文件,对这些资源的所在位置进行显式声明就可以了,以帮助 Flutter 识别出这些资源。
  • 在指定路径名的过程中,我们既可以对每一个文件进行挨个指定,也可以采用子目录批量指定的方式。

如下所示,我们将资源放入 assets 目录下,其中,两张图片 background.jpg、loading.gif 与 JSON 文件 result.json 在 assets 根目录,而另一张图片 food_icon.jpg 则在 assets 的子目录 icons 下。

  1. assets
  2. ├── background.jpg
  3. ├── icons
  4. └── food_icon.jpg
  5. ├── loading.gif
  6. └── result.json

对于上述资源文件存放的目录结构,以下代码分别演示了挨个指定和子目录批量指定这两种方式:通过单个文件声明的,我们需要完整展开资源的相对路径;而对于目录批量指定的方式,只需要在目录名后加路径分隔符就可以了:

  1. flutter:
  2. assets:
  3. - assets/background.jpg #挨个指定资源路径
  4. - assets/loading.gif #挨个指定资源路径
  5. - assets/result.json #挨个指定资源路径
  6. - assets/icons/ #子目录批量指定
  7. - assets/ #根目录也是可以批量指定的

目录批量指定并不递归,只有在该目录下的文件才可以被包括,如果下面还有子目录的话,需要单独声明子目录下的文件。
**
在 Flutter 中,对不同类型的资源文件处理方式略有差异:

  • 图片: Image.asset()
  • 对于其他资源文件的加载,我们可以通过 Flutter 应用的主资源 Bundle 对象 rootBundle,来直接访问。
    • 对于字符串文件资源,我们使用 loadString 方法;
    • 而对于二进制文件资源,则通过 load 方法。
  1. rootBundle.loadString('assets/result.json').then((msg)=>print(msg));

Flutter 也遵循了基于像素密度的管理方式, 如果想让 Flutter 适配不同的分辨率,我们需要将其他分辨率的图片放到对应的分辨率子目录中,如下所示:

  1. assets
  2. ├── background.jpg //1.0x图
  3. ├── 2.0x
  4. └── background.jpg //2.0x图
  5. └── 3.0x
  6. └── background.jpg //3.0x图

而在 pubspec.yaml 文件声明这个图片资源时,仅声明 1.0x 图资源即可

  1. flutter:
  2. assets:
  3. - assets/background.jpg #1.0x图资源

即使我们的 App 包没有包含 1.0x 资源,我们仍然需要像上面那样在 pubspec.yaml 中将它显示地声明出来,因为它是资源的标识符。(就是没有 1.0x, 但是有 2.0x 的情况)

字体则是另外一类较为常用的资源:
**
在 Flutter 中,使用自定义字体同样需要在 pubspec.yaml 文件中提前声明。需要注意的是,字体实际上是字符图形的映射。所以,除了正常字体文件外,如果你的应用需要支持粗体和斜体,同样也需要有对应的粗体和斜体字体文件。

在将 RobotoCondensed 字体摆放至 assets 目录下的 fonts 子目录后,下面的代码演示了如何将支持斜体与粗体的 RobotoCondensed 字体加到我们的应用中:

  1. fonts:
  2. - family: RobotoCondensed #字体名字
  3. fonts:
  4. - asset: assets/fonts/RobotoCondensed-Regular.ttf #普通字体
  5. - asset: assets/fonts/RobotoCondensed-Italic.ttf
  6. style: italic #斜体
  7. - asset: assets/fonts/RobotoCondensed-Bold.ttf
  8. weight: 700 #粗体

原生平台的资源设置