flutter - built_value 自动生成model

使用built_value自动生成

google 团队内开发 flutter 必备工具

  1. 我们拥有的或者说接口返回的数据,通常是一个json格式的字符串, 这里用response指代此数据,其包含id , token, name … 等字段。在使用时常常转换为Map使用: user["id"], user["name"]

  2. 如果将其转换成 一个类后,我们就可以直接调用: user.id, user.name 非常方便.

  3. 同时定义一系列转换类型方法,可以让我们快速得创建一个类,修改一个类,在几种类型之间转换一个类(Map <=> json <=> TestMode)

  4. 所以,built_value 是为了快速实现模型的定义而生

{
	"code":200,
	"msg":"success",
	"data":{
      "id": 157538,
      "token": "fneaongegne9u98ubgby8g",
      "name":"ifredom",
      "date": "2020-10-11 16:21:16",
      "type": ,
      "title": {
          "rendered": "Json 2 dart built_value converter"
      },
      "tags": [
          "js",
          "flutter"
      ]
   }
}

环境

// 空安全 null-safety
environment:
  sdk: ">=2.12.0 <3.0.0"
  • 第一步,安装,built_value: ^8.0.0 以及 build_runner: ^2.0.1
  • 第二步,创建model文件
  • 第三步,执行命令(命令会自动在项目目录下寻找可生成文件)

安装依赖

dependencies:
  flutter:
    sdk: flutter
  built_value: ^8.0.0
  built_collection: ^5.1.0

## .....
dev_dependencies:
  flutter_test:
    sdk: flutter

  build_runner: ^2.0.1
  built_value_generator: ^8.0.6

创建model文件

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


import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';

part 'testmode.g.dart';

abstract class Testmode implements Built<Testmode, TestmodeBuilder> {
  String get id;

  String get token;

  String? get name;
  
  BuiltList<String> get tags;

  Testmode._();
  factory Testmode([updates(TestmodeBuilder b)]) = _$Testmode;
}

model文件注意事项:

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

vscode中有一个插件 built_value,可以通过snippet bvt 快速书写,其文档有写明

执行命令

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

>> flutter packages pub run build_runner build --delete-conflicting-outputs

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

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

	// 构造一个类
	Testmode _test1 =	Testmode();
	// 将json转换为 TestModel
	Testmode _test2 = Testmode.fromJSON(responseJSON);
	// 将 TestModel 转换为Map
	Map _test3 = _test2.toMap();
	// 将 TestModel 转换为 json
	String _test4 = _test2.toJSON();
	//将 Map 转换为 TestModel
	Testmode _test5 = Testmode.fromMap(mapData);

	print(_test2.name);



高级用法之 serializers(序列化)

response.json

{
	"id": "ehfiosu893ufn3nf3f",
	"token": "ehfiosu893ufn3nf3f",
	"name": "ifredom",
	"age": 18,
	"userLevel" : 21,
	"tags": ["js","flutter"]
	......
}
  • 第一步. 创建序列化文件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,
])

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> {
  String get id;

  String get token;

  String? get name;

  BuiltList<String> get tags;
  
// 新增得序列化方法
  String toJson() {
    return json.encode(serializers.serializeWith(Testmode.serializer, this));
  }

// 新增得序列化方法
  Map<String, dynamic> toMap() {
    return serializers.serializeWith(Testmode.serializer, this);
  }

// 新增得序列化方法
  static  Testmode? fromJson(String jsonString) {
    return serializers.deserializeWith(
      Testmode.serializer,
      json.decode(jsonString),
    );
  }

// 新增得序列化方法
  static Testmode? fromMap(Map<String, dynamic> map) {
    return serializers.deserializeWith(
      Testmode.serializer,
      map,
    );
  }

  Testmode._();
  // 注意只有这里是首字母小写 _$testmodeSerializer
  static Serializer<Testmode> get serializer => _$testmodeSerializer;
  factory Testmode([updates(TestmodeBuilder b)]) = _$Testmode;
}

第三步,再次执行命令,你会发现 testmode.g.dart 里面内容复杂了很多

>> flutter packages pub run build_runner build

使用

此时,就可以使用模型中的序列化方法,快速对数据进行转换了

  1. 使用序列化
	Testmode testMode =	Testmode();
	
	Testmode.fromMap(MapData);

	Testmode.fromJSON(responseJSON);
  1. 更新类 的某一项数据
  Future<void> updateUserType(String userType) async {
    // 写法一
    _currentUser = _currentUser.rebuild((u) => u..userType = userType);
    // 写法二
    // p = (p.toBuilder().userType = 'hello world').build();
  }
  1. 生成类中有 list 数据, 在abstract类中使用BuiltList字段
   // 构造一个类,无默认值
   TestMode _testMode1 = TestMode();
   // 构造一个类,根据某一字段
   TestMode _testMode1 = TestMode(
     (u) => u
       ..name = 'ifredom',
   );
   // 构造一个类,根据若干字段
   TestMode _testMode2 = TestMode(
      (u) => u
        ..name = 'ifredom'
        ..tags = ["js","flutter"].toBuilder(),
    );
    // 创建 BuiltList类型数据
    final BuiltList<Note> noteMode = noteList.toBuiltList();
参考资料

built_value document
Create_Built_Value_Class

--------------如果文章对你有用,请右上角点赞/收藏,谢谢-------------

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值