Flutter 官方是不推薦使用反射來進行對象轉(zhuǎn)換,因為它影響性能造成卡頓等問題。使用反射需要依賴dart:mirrors庫,然而dart:mirrors庫在Flutter中是不被支持的。
上網(wǎng)查了一些方案,推薦使用json_annotation+json_serializable+build_runner,自動生成映射關(guān)系方案。
首先在pubspec.yaml添加依賴:
...
dependencies:
...
json_annotation: ^4.9.0 # json注解庫
dev_dependencies:
...
json_serializable: ^6.8.0
build_runner: ^2.4.11
...
創(chuàng)建一個模型account_book.dart
import 'package:json_annotation/json_annotation.dart';
part 'account_book.g.dart'; // 這一行需要手動寫
abstract class SModel {
SModel.fromJson(Map data);
Map<String, dynamic> toJson();
}
class AccountBook extends SModel {
// 添加一些屬性
@JsonKey(required: true)
late int id = 0;
@JsonKey(required: true)
late String name;
@JsonKey(defaultValue: 0)
late int order = 0;
// 先建構(gòu)造方法
AccountBook() : super.fromJson({});
factory AccountBook.fromJson(data) {
throw UnimplementedError();
}
}
在命令行運行 build_runner 來生成 account_book.g.dart 的轉(zhuǎn)換文件,每次更新和新增都需要調(diào)用。
dart run build_runner build
運行完成后就可以在目錄上看到account_book.g.dart

image.png
查看
account_book.g.dart文件可以看到有兩個轉(zhuǎn)換方法
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'account_book.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
AccountBook _$AccountBookFromJson(Map<String, dynamic> json) {
$checkKeys(
json,
requiredKeys: const ['id', 'name'],
);
return AccountBook()
..id = (json['id'] as num).toInt()
..name = json['name'] as String
..order = (json['order'] as num?)?.toInt() ?? 0;
}
Map<String, dynamic> _$AccountBookToJson(AccountBook instance) =>
<String, dynamic>{
'id': instance.id,
'name': instance.name,
'order': instance.order,
};
將這兩個方法寫到account_book.dart模型里面即可
import 'package:json_annotation/json_annotation.dart';
part 'account_book.g.dart'; // 這一行需要手動寫
class AccountBook {
// 添加一些屬性
@JsonKey(required: true)
late int id = 0;
@JsonKey(required: true)
late String name;
@JsonKey(defaultValue: 0)
late int order = 0;
// 先建構(gòu)造方法
AccountBook() : super.fromJson({});
// 轉(zhuǎn)對象
factory AccountBook.fromJson(data) => _$AccountBookFromJson(data);
// 轉(zhuǎn)Map
Map<String, dynamic> toJson() => _$AccountBookToJson(this);
}
使用方式
var accountBook = AccountBook.fromJson({"id":1, "name": "我的"});
print('${accountBook.toJson()}');