后台接口返回数据,若是一个个字段去写,建立模型会很头痛。这个工具,转为迅速根据接口或者说json串,迅速生成一个类java
built_value: ^7.0.4
以及 build_runner: ^1.7.2dependencies: flutter: sdk: flutter built_value: ^7.0.4 ## ..... dev_dependencies: flutter_test: sdk: flutter build_runner: ^1.7.2 复制代码
好比先后台约定好了接口,用户信息里包含字段 id , token, name,此时咱们就来定义这个用户模型。ios
建立一个文件testmode.dart
, 直接复制.git
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文件注意事项:github
Testmode
替换你本身想要得类名,例如User, DeviceModel
之类,一个不要落下get
在项目根目录下,执行命令json
>> flutter packages pub run build_runner build
复制代码
若是成功,那么会在testmode.dart
所在文件位置下出现一个testmode.g.dart
,接下来就能够愉快得使用 Testmode这个类了.markdown
到这里,自动生成类已经完成了。dom
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
这样调用。ui
可是若是将其转换成 一个类(实体类)后,咱们就能够直接 response.id, response.name
调用了。this
因此,序列化是为了快速实现模型的转换而阐述
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);
...
复制代码
--------------------若是文章有帮助,感谢右上角随手点赞-------------------------