美文网首页
Flutter-对象、Map相互转换

Flutter-对象、Map相互转换

作者: WhoJun | 来源:发表于2024-07-14 11:06 被阅读0次

Flutter 官方是不推荐使用反射来进行对象转换,因为它影响性能造成卡顿等问题。使用反射需要依赖dart:mirrors库,然而dart:mirrors库在Flutter中是不被支持的。

上网查了一些方案,推荐使用json_annotation+json_serializable+build_runner,自动生成映射关系方案。

首先在pubspec.yaml添加依赖:

...
dependencies:
  ...
  json_annotation: ^4.9.0 # json注解库
dev_dependencies:
  ...
  json_serializable: ^6.8.0
  build_runner: ^2.4.11
...

创建一个模型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;

   // 先建构造方法
  AccountBook() : super.fromJson({});
  factory AccountBook.fromJson(data) {
    throw UnimplementedError();
  }
}

在命令行运行 build_runner 来生成 account_book.g.dart 的转换文件,每次更新和新增都需要调用。

dart run build_runner build

运行完成后就可以在目录上看到account_book.g.dart

image.png
查看 account_book.g.dart文件可以看到有两个转换方法
// 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;
  
  // 先建构造方法 
  AccountBook() : super.fromJson({});  
  // 转对象
  factory AccountBook.fromJson(data) => _$AccountBookFromJson(data);
  
  // 转Map
  Map<String, dynamic> toJson() => _$AccountBookToJson(this);
}

使用方式

var accountBook = AccountBook.fromJson({"id":1, "name": "我的"});
print('${accountBook.toJson()}');

相关文章

网友评论

      本文标题:Flutter-对象、Map相互转换

      本文链接:https://www.haomeiwen.com/subject/jiqchjtx.html