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);

...
复制代码

--------------------若是文章有帮助,感谢右上角随手点赞-------------------------

相关文章
相关标签/搜索