Flutter 之 YAML 文件的各种读取形式的详细介绍(二)

987 阅读6分钟

[》跳过拾光记忆]

拾光记忆

1-15.资产管理 Fam、手势触摸、枚举高阶用法、快速实现单选和多选、Diy 滑动轨道、水印功能、Image 高阶用法、矩阵16个参数含义、颜色差异、颜色填充、图像镜像、图像旋转、图像去色等功能的集合

简介: 该篇主要介绍15 篇文章含有功能的目录,可根据自己的需求选择对应的功能介绍查看。
推荐: ⭐️⭐️⭐️⭐️⭐️

16. Flutter 之 IImage 图像反色处理

简介: 该篇主要介绍 Flutter 之 IImage 库中如何实现图像反色功能以及实现原理的介绍。
推荐: ⭐️⭐️⭐️⭐️⭐️

17. Flutter 绘制路径 Path 的全部方法介绍,一篇足矣~(一)

18. Flutter 绘制路径 Path 的全部方法介绍,一篇足矣~(二)

19. Flutter 绘制路径 Path 的全部方法介绍,一篇足矣~(三)

简介: 该篇主要介绍 Flutter 之 图形(Canvas) 绘制路径 (Path)基础功能以及方法实现底层代码的解析。
推荐: ⭐️⭐️⭐️⭐️⭐️

20. Flutter 聊天气泡拉伸之点九图(NinePatchDrawable)应用总结

简介: 该篇主要介绍 Flutter 中聊天气泡的实现和图像点九图以及在使用图像拉伸实现气泡时遇到问题的分析和解决方法的总结。
推荐: ⭐️⭐️⭐️⭐️⭐️

21. Flutter 之 YAML 数据序列文件的基础知识,一篇足矣!(一)

简介: 该篇主要介绍 YAML的基础信息以及基础语法和对应转化为 JSON 的实例举例。
推荐: ⭐️⭐️⭐️⭐️⭐️

22. Flutter 关键字之 final 的详细介绍

简介: 该篇主要介绍 Dart 中关键字之一的 final,它的特点、应用时机、优点的总结以及应用实例验证和展示。
推荐: ⭐️⭐️⭐️⭐️

[返回拾光记忆《]

一、简述

我们在 Flutter 之 YAML 数据序列文件的基础知识,一篇足矣!(一) 这篇文章中介绍了YAML 的基础信息和基础知识以及 YAMLJSON 的应用实例。 如有还对 YAML 知之甚少的,请先看 YAML 基础的那篇文章;本篇文章主要是介绍 FlutterYAML 文件有多少种读取形式以及读取相关知识介绍。

二、读取 YAML

1. YAML 文件的配置

Flutter 项目中资源文件的读取是要先对资源文件在 pubspec.yaml 文件中进行配置,然后才能在项目中读取。下面我们使用 fam 进行资源配置管理,步骤如下:

  1. 首先使用 fam init 指令初始化项目资源管理服务,如下:

    image.png 指令执行完毕后,项目中就会自动生成 assets 文件夹以及 lib/fam 文件夹以及在 pubspec.yaml 文件中添加资源引用路径。如下:

    image.png

    题外话(广告): Fam 是针对 Flutter 项目资源管理目前表现最好的、功能最多的、操作简单的、界面美观的脚本服务,它依托于 pub.dev 维护版本更新。这是 Fam 更详细的介绍文章快捷入口 Flutter 项目资产管理,看这一篇就够了!。让我们一起领略 Fam 的风采和魅力以及成长。

  2. 创建 YAML 文件,加入 Fam 管理
    我们以 pubspec.yaml 文件的内容创建 y_file.yaml 文件,如下:

    image.png 然后,使用 fam run 指令将文件加入 Fam 管理中,如下:

    image.png

2. 二进制(ByteData)形式

我们使用 rootBundle.load方法读取文件的二进制,代码如下:

```flutter
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.load(FamManager.yFile).then((ByteData byteData) {
    debugPrint('${byteData.lengthInBytes}'); // 3638
  });
}
```
上述代码运行的结果如下:

![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b85de5c4730849cca15e85572bb221fc~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1264&h=299&s=103533&e=png&b=1f1f1f)
我们可以将 `ByteData byteData` 结果转化为 `ByteBuffer` 或者 `字符串`,如下:

```flutter
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.load(FamManager.yFile).then((ByteData byteData) {
    debugPrint('${byteData.lengthInBytes}'); // 3638
    final ByteBuffer byteBuffer = byteData.buffer;
    final String yaml = utf8.decode(byteBuffer.asUint8List());
    debugPrint(yaml);
  });
}
```

3. ImmutableBuffer 形式

我们可以使用 rootBundle.loadBuffer 方法读取文件得到缓冲区的句柄,代码如下:

```flutter
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadBuffer(FamManager.yFile).then((ImmutableBuffer immutableBuffer) {
    print(immutableBuffer.length);
  });
}
```
**ImmutableBuffer** 可以转化为字符串。

4. 字符串(String)形式

我们可以使用 rootBundle.loadString 方法读取文件得到字符串,代码如下:

```flutter
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadString(FamManager.yFile).then((String value) {
    print(value);
  });
}
```
上述代码运行的结果如下:

![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bf0e68c3452940a4a955a22a4c4b20b1~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=803&h=889&s=230613&e=png&b=1e1e1e)

5. 多类型(Future<T>)输出形式

我们可以使用 rootBundle.loadStructuredData 方法读取文件的字符串,然后再将字符串经过处理,返回 Future<T> 形式。代码如下:

```flutter
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadStructuredData(FamManager.yFile, (content) async => content).then((value) {
    print(value);
  });
}
```
上面我们也是以 `Future<String>` 形式返回的,输入就是 `y_file.yaml` 的内容就不再粘贴了。

6. YAML 包支持读取形式

上面第 2 ~ 5 步都是系统 AssetBundle:rootBundle 提供读取文件的方法,不同的方法返回不同的数据格式。这些数据格式在实际开发中可能不是我们想要的,所以为了满足开发需求,YAML 包增加几种读取 YAML 文件返回不同数据类型的方法。

6-1. 添加 YAML

我们在项目的根目录终端下执行 flutter packages add faml 指令即可添加 YAML 包。或者去 YAML 包的YAML官网 拷贝依赖项 yaml: ^3.1.2 添加到项目 pubspec.yaml 文件的 dependencies:flutter 下,如下:

image.png

6-2. YamlMap 形式

我们使用 YAML 包的 loadYaml 方法读取 YAML 文件,并以 YamlMap 形式返回结果,代码如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadStructuredData<YamlMap>(FamManager.yFile, (content) async {
    return loadYaml(content);
  }).then((YamlMap yamlMap) {
    print(yamlMap);
  });
}

上述我们得到了从 YAML 解析的只读 YamlMap ,从 YamlMap我们可以获取节点图、Map、Keys、Map的样式等信息。上述输入的 Map 内容如下:

{
    name: handle_yaml, 
    description: A new Flutter project., 
    publish_to: none, 
    version: 1.0.0+1, 
    environment: {sdk: >=2.19.6 <3.0.0}, 
    dependencies: {
        flutter: {sdk: flutter}, 
        cupertino_icons: ^1.0.2, 
        yaml: ^3.1.2
    }, 
    dev_dependencies: {
        flutter_test: {sdk: flutter}, 
        flutter_lints: ^2.0.0
    }, 
    flutter: {
        uses-material-design: true, 
        assets: [
            assets[/]()
        ]
    }
}
6-3. YamlDocument 形式

我们使用 YAML 包的 loadYamlDocument 方法读取 YAML 文件,并以 YamlDocument 形式返回结果,代码如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadStructuredData<YamlDocument>(FamManager.yFile, (content) async {
    return loadYamlDocument(content);
  }).then((YamlDocument yamlDocument) {
    print(yamlDocument.contents);
  });
}

YamlDocument:yamlDocument 我们获取到文档的内容(YamlNode contents)、文档的跨度(SourceSpan span)、文档的版本(VersionDirective? versionDirective)、文档中的标签(List<TagDirective> tagDirectives) 、判断文档开头是隐式还是显式(bool startImplicit)、判断文档的结尾是隐式还是显式(bool endImplicit) 等功能。

6-4. List<YamlDocument> 形式

我们使用 YAML 包的 loadYamlDocuments 方法读取 YAML 文件,并以 List<YamlDocument> 形式返回结果,代码如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadStructuredData<List<YamlDocument>>(FamManager.yFile, (content) async {
    return loadYamlDocuments(content);
  }).then((List<YamlDocument> yamlDocuments) {
    print(yamlDocuments.first.contents);
  });
}

我们得到的 List<YamlDocument> 结果,我们就不做介绍了,基础的还是 YamlDocument

6-5. YamlNode 形式

我们使用 YAML 包的 loadYamlNode 方法读取 YAML 文件,并以 YamlNode 形式返回结果,代码如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadStructuredData<YamlNode>(FamManager.yFile, (content) async {
    return loadYamlNode(content);
  }).then((YamlNode yamlNode) {
    print(yamlNode.value);
  });
}

我们可以通过 YamlNode 获取文档的跨度(SourceSpan span)、文档的内容(dynamic value)等信息。

6-6. YamlList 形式

我们使用 YAML 包的 loadYamlStream 方法读取 YAML 文件,并以 YamlList 形式返回结果,代码如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  rootBundle.loadStructuredData<YamlList>(FamManager.yFile, (content) async {
    return loadYamlStream(content);
  }).then((YamlList yamlList) {
    print(yamlList.value);
  });
}

我们可以通过 YamlList 获取文档的节点结合(List<YamlNode> nodes)、文档的内容(List value)、文档的格式 (CollectionStyle style) 等信息。

三、鼓励与支持

上面是 Flutter 读取 YAML文档的多种方式的介绍,我们可以根据自己的业务需求选择合适的方法来完成任务。如果你感觉总结的还可以,那请留下你的点赞、关注与分享,如果感觉哪里有不正确的或者建议,请评论或者留言。 本篇文章的测试代码地址 YAML 多种读取方式代码仓库