google 团队内开发 flutter 必备工具
我们拥有的或者说接口返回的数据,通常是一个json格式的字符串, 这里用response
指代此数据,其包含id , token, name … 等字段。在使用时常常转换为Map使用: user["id"], user["name"]
如果将其转换成 一个类后,我们就可以直接调用: user.id, user.name
非常方便.
同时定义一系列转换类型方法,可以让我们快速得创建一个类,修改一个类,在几种类型之间转换一个类(Map <=> json <=> TestMode)
所以,built_value 是为了快速实现模型的定义而生
{
"code":200,
"msg":"success",
"data":{
"id": 157538,
"token": "fneaongegne9u98ubgby8g",
"name":"ifredom",
"date": "2020-10-11 16:21:16",
"type": ,
"title": {
"rendered": "Json 2 dart built_value converter"
},
"tags": [
"js",
"flutter"
]
}
}
// 空安全 null-safety
environment:
sdk: ">=2.12.0 <3.0.0"
built_value: ^8.0.0
以及 build_runner: ^2.0.1dependencies:
flutter:
sdk: flutter
built_value: ^8.0.0
built_collection: ^5.1.0
## .....
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.0.1
built_value_generator: ^8.0.6
创建一个文件testmode.dart
, 直接复制.
import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';
part 'testmode.g.dart';
abstract class Testmode implements Built<Testmode, TestmodeBuilder> {
String get id;
String get token;
String? get name;
BuiltList<String> get tags;
Testmode._();
factory Testmode([updates(TestmodeBuilder b)]) = _$Testmode;
}
model文件注意事项:
Testmode
替换你自己想要得类名,例如User, DeviceModel
之类得,全局替换,一个不要落下get
vscode中有一个插件 built_value,可以通过snippet bvt 快速书写,其文档有写明
在项目根目录下,执行命令
>> flutter packages pub run build_runner build --delete-conflicting-outputs
如果成功,那么会在testmode.dart
所在文件位置下出现一个testmode.g.dart
,接下来就可以愉快得使用 Testmode这个类了.
到这里,自动生成类已经完成了。
// 构造一个类
Testmode _test1 = Testmode();
// 将json转换为 TestModel
Testmode _test2 = Testmode.fromJSON(responseJSON);
// 将 TestModel 转换为Map
Map _test3 = _test2.toMap();
// 将 TestModel 转换为 json
String _test4 = _test2.toJSON();
//将 Map 转换为 TestModel
Testmode _test5 = Testmode.fromMap(mapData);
print(_test2.name);
response.json
{
"id": "ehfiosu893ufn3nf3f",
"token": "ehfiosu893ufn3nf3f",
"name": "ifredom",
"age": 18,
"userLevel" : 21,
"tags": ["js","flutter"]
......
}
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,
])
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> {
String get id;
String get token;
String? get name;
BuiltList<String> get tags;
// 新增得序列化方法
String toJson() {
return json.encode(serializers.serializeWith(Testmode.serializer, this));
}
// 新增得序列化方法
Map<String, dynamic> toMap() {
return serializers.serializeWith(Testmode.serializer, this);
}
// 新增得序列化方法
static Testmode? fromJson(String jsonString) {
return serializers.deserializeWith(
Testmode.serializer,
json.decode(jsonString),
);
}
// 新增得序列化方法
static Testmode? fromMap(Map<String, dynamic> map) {
return serializers.deserializeWith(
Testmode.serializer,
map,
);
}
Testmode._();
// 注意只有这里是首字母小写 _$testmodeSerializer
static Serializer<Testmode> get serializer => _$testmodeSerializer;
factory Testmode([updates(TestmodeBuilder b)]) = _$Testmode;
}
第三步,再次执行命令,你会发现 testmode.g.dart
里面内容复杂了很多
>> flutter packages pub run build_runner build
此时,就可以使用模型中的序列化方法,快速对数据进行转换了
Testmode testMode = Testmode();
Testmode.fromMap(MapData);
Testmode.fromJSON(responseJSON);
Future<void> updateUserType(String userType) async {
// 写法一
_currentUser = _currentUser.rebuild((u) => u..userType = userType);
// 写法二
// p = (p.toBuilder().userType = 'hello world').build();
}
BuiltList
字段 // 构造一个类,无默认值
TestMode _testMode1 = TestMode();
// 构造一个类,根据某一字段
TestMode _testMode1 = TestMode(
(u) => u
..name = 'ifredom',
);
// 构造一个类,根据若干字段
TestMode _testMode2 = TestMode(
(u) => u
..name = 'ifredom'
..tags = ["js","flutter"].toBuilder(),
);
// 创建 BuiltList类型数据
final BuiltList<Note> noteMode = noteList.toBuiltList();
built_value document
Create_Built_Value_Class
--------------如果文章对你有用,请右上角点赞/收藏,谢谢-------------