Flutter-對象、Map相互轉(zhuǎn)換

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()}');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容