flutter - built_value自动生成模型

3,379 阅读1分钟

使用built_value自动生成

后台接口返回数据,如果一个个字段去写,创建模型会很头痛。这个工具,转为迅速根据接口或者说json串,迅速生成一个类

  • 第一步,安装,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,此时我们就来定义这个用户模型。

创建一个文件testmode.dart , 直接复制.


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文件注意事项:

  • 当你创建了model文件时(可直接复制体验),IDE会提示你找不到 TestmodeBuilder 这个类,不必担心,直接执行命令
  • 创建了model文件,将其中Testmode 替换你自己想要得类名,例如User, DeviceModel之类,一个不要落下
  • 注意所有字段都要有 get

执行命令

在项目根目录下,执行命令

>> flutter packages pub run build_runner build

如果成功,那么会在testmode.dart所在文件位置下出现一个testmode.g.dart,接下来就可以愉快得使用 Testmode这个类了.

到这里,自动生成类已经完成了。




高级用法之 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 这样调用。

  2. 但是如果将其转换成 一个类(实体类)后,我们就可以直接 response.id, response.name 调用了。

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

...

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