flutter - built_value自動生成模型

使用built_value自動生成

後臺接口返回數據,若是一個個字段去寫,建立模型會很頭痛。這個工具,轉爲迅速根據接口或者說json串,迅速生成一個類java

  • 第一步,安裝,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,此時咱們就來定義這個用戶模型。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

  • 當你建立了model文件時(可直接複製體驗),IDE會提示你找不到 TestmodeBuilder 這個類,沒必要擔憂,直接執行命令
  • 建立了model文件,將其中Testmode 替換你本身想要得類名,例如User, DeviceModel之類,一個不要落下
  • 注意全部字段都要有 get

執行命令

在項目根目錄下,執行命令json

>> flutter packages pub run build_runner build
複製代碼

若是成功,那麼會在testmode.dart所在文件位置下出現一個testmode.g.dart,接下來就能夠愉快得使用 Testmode這個類了.markdown

到這裏,自動生成類已經完成了。dom




高級用法之 serializers(序列化)

response.json工具

{
	"id": "ehfiosu893ufn3nf3f",
	"token": "ehfiosu893ufn3nf3f",
	"name": "ifredom",
	"age": 18,
	"userLevel" : 21,
	"tags": ["js","flutter"]
	......
}
複製代碼
  1. 對於一個模型TestMode,咱們擁有的或者說接口返回的,一般是一個json字符串,這裏用response指代此數據,其包含id , token, name ... 等字段。在使用時,無法直接 response.id, response.name 這樣調用。ui

  2. 可是若是將其轉換成 一個類(實體類)後,咱們就能夠直接 response.id, response.name 調用了。this

  3. 因此,序列化是爲了快速實現模型的轉換而闡述

  • 第一步. 建立序列化文件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);

...
複製代碼

--------------------若是文章有幫助,感謝右上角隨手點贊-------------------------

相關文章
相關標籤/搜索