使用built_value自动生成
后台接口返回数据,如果一个个字段去写,创建模型会很头痛。这个工具,转为迅速根据接口或者说json串,迅速生成一个类
- 第一步,安装,
built_value: ^7.0.4
以及 build_runner: ^1.7.2 - 第二步,创建model文件
- 第三步,执行命令
安装依赖
dependencies:
flutter:
sdk: flutter
built_value: ^7.0.4
## .....
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^1.7.2
创建model文件
比如前后台约定好了接口,用户信息里包含字段 id , token, name,此时我们就来定义这个用户模型。
创建一个文件testmode.dart
, 直接复制.
import 'package:built_value/built_value.dart';
part 'testmode.g.dart';
abstract class Testmode implements Built<Testmode, TestmodeBuilder> {
@nullable
String get id;
@nullable
String get token;
String get name;
Testmode._();
factory Testmode([updates(TestmodeBuilder b)]) = _$Testmode;
}
model文件注意事项:
- 当你创建了model文件时(可直接复制体验),IDE会提示你找不到 TestmodeBuilder 这个类,不必担心,直接执行命令
- 创建了model文件,将其中
Testmode
替换你自己想要得类名,例如User, DeviceModel
之类,一个不要落下 - 注意所有字段都要有
get
执行命令
在项目根目录下,执行命令
>> flutter packages pub run build_runner build
如果成功,那么会在testmode.dart
所在文件位置下出现一个testmode.g.dart
,接下来就可以愉快得使用 Testmode这个类了.
到这里,自动生成类已经完成了。
高级用法之 serializers(序列化)
response.json
{
"id": "ehfiosu893ufn3nf3f",
"token": "ehfiosu893ufn3nf3f",
"name": "ifredom",
"age": 18,
"userLevel" : 21,
"tags": ["js","flutter"]
......
}
-
对于一个模型
TestMode
,我们拥有的或者说接口返回的,通常是一个json字符串,这里用response
指代此数据,其包含id , token, name ... 等字段。在使用时,没法直接response.id, response.name
这样调用。 -
但是如果将其转换成 一个类(实体类)后,我们就可以直接
response.id, response.name
调用了。 -
所以,
序列化是为了快速实现模型的转换而阐述
- 第一步. 创建序列化文件
serializers.dart
- 第二步.修改
testmode.dart
文件,并引入序列化文件serializers.dart
- 第三步. 执行生成命令
第一步. 创建文件serializers.dart
library serializers;
import 'package:built_value/iso_8601_date_time_serializer.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'testmode/testmode.dart';
part 'serializers.g.dart';
/// 模型列表,这个文件
/// - 在这里添加你想要序列化得模型
@SerializersFor([
Testmode,
])
/// Can add additional plugins that will serialize types like [DateTime]
/// - It is also possible to write your own Serializer plugins for type that
/// are not supported by default.
/// - For Example: https://github.com/google/built_value.dart/issues/543
/// implements [SerializerPlugin] and writes a serializer for Firebase
/// Datetime that converts TimeStamp or DateTime to integers.
final Serializers serializers = (_$serializers.toBuilder()
..addPlugin(StandardJsonPlugin())
..add(Iso8601DateTimeSerializer()))
.build();
第二步.修改testmode.dart文件,添加若干序列化方法
import 'dart:convert';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
// 引入`serializers.dart`文件,改成在你项目中的正确路径
import 'package:myflutter/core/model/serializers.dart';
part 'testmode.g.dart';
abstract class Testmode implements Built<Testmode, TestmodeBuilder> {
@nullable
String get id;
@nullable
String get token;
String get name;
// 新增得序列化方法
String toJson() {
return json.encode(serializers.serializeWith(Testmode.serializer, this));
}
// 新增得序列化方法
Map<String, dynamic> toMap() {
return serializers.serializeWith(Testmode.serializer, this);
}
// 新增得序列化方法
factory Testmode.fromJson(String jsonString) {
return serializers.deserializeWith(
Testmode.serializer,
json.decode(jsonString),
);
}
// 新增得序列化方法
factory Testmode.fromMap(Map<String, dynamic> map) {
return serializers.deserializeWith(
Testmode.serializer,
map,
);
}
Testmode._();
// 新增得序列化方法
static Serializer<Testmode> get serializer => _$testmodeSerializer;
factory Testmode([updates(TestmodeBuilder b)]) = _$Testmode;
}
第三步,再次执行命令,你会发现 testmode.g.dart
里面内容复杂了很多
>> flutter packages pub run build_runner build
此时,你就可以使用模型中的序列化方法,快速对数据进行转换了
...
Testmode.fromMap(MapData);
Testmode.fromJSON(responseJSON);
...
--------------------如果文章有帮助,感谢右上角随手点赞-------------------------