後臺接口返回數據,若是一個個字段去寫,建立模型會很頭痛。這個工具,轉爲迅速根據接口或者說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);
...
複製代碼
--------------------若是文章有幫助,感謝右上角隨手點贊-------------------------