[》跳过拾光记忆]
拾光记忆
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
的基础信息和基础知识以及 YAML
转 JSON 的应用实例。 如有还对 YAML
知之甚少的,请先看 YAML
基础的那篇文章;本篇文章主要是介绍 Flutter 中 YAML
文件有多少种读取形式以及读取相关知识介绍。
二、读取 YAML
1. YAML 文件的配置
在 Flutter
项目中资源文件的读取是要先对资源文件在 pubspec.yaml
文件中进行配置,然后才能在项目中读取。下面我们使用 fam 进行资源配置管理,步骤如下:
-
首先使用
fam init
指令初始化项目资源管理服务,如下:指令执行完毕后,项目中就会自动生成
assets
文件夹以及lib/fam
文件夹以及在pubspec.yaml
文件中添加资源引用路径。如下:题外话(广告):
Fam
是针对 Flutter 项目资源管理目前表现最好的、功能最多的、操作简单的、界面美观的脚本服务,它依托于pub.dev
维护版本更新。这是Fam
更详细的介绍文章快捷入口 Flutter 项目资产管理,看这一篇就够了!。让我们一起领略Fam
的风采和魅力以及成长。 -
创建
YAML
文件,加入 Fam 管理
我们以pubspec.yaml
文件的内容创建y_file.yaml
文件,如下:然后,使用
fam run
指令将文件加入 Fam 管理中,如下:
2. 二进制(ByteData)形式
我们使用 rootBundle.load
方法读取文件的二进制,代码如下:
```flutter
void main() async {
WidgetsFlutterBinding.ensureInitialized();
rootBundle.load(FamManager.yFile).then((ByteData byteData) {
debugPrint('${byteData.lengthInBytes}'); // 3638
});
}
```
上述代码运行的结果如下:

我们可以将 `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);
});
}
```
上述代码运行的结果如下:

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
下,如下:
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 多种读取方式代码仓库 。