Flutter对象映射插件object_mapper的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter对象映射插件object_mapper的使用

object_mapper 是一个用于 Dart 语言的包,它简化了模型对象与 JSON 之间的转换。本文将详细介绍如何在 Flutter 项目中使用 object_mapper 插件,并提供完整的示例代码。

安装插件

首先,在你的 pubspec.yaml 文件中添加 object_mapper 的依赖:

dependencies:
  object_mapper: ^1.0.0

然后运行 flutter pub get 来安装该插件。

实现步骤

Step 1:扩展类

要使用 object_mapper,你需要让你的模型类继承 Mappable mixin。

class TestInfo with Mappable {
    int id;
}

Step 2:重写 mapping 方法

你需要在模型类中重写 mapping 方法,定义属性如何从 JSON 映射到对象以及反之亦然。

class TestInfo with Mappable {
  int id;

  @override
  void mapping(Mapper map) {
    map("id", id, (v) => id = v);
  }
}

Step 3:注册工厂方法

为了能够正确创建实例,需要将你的模型类注册到 Mappable.factories 中。

Mappable.factories = {
  TestInfo: () => TestInfo()
};

使用示例

将 JSON 转换为对象

final json = {
  "id": 2
};

final info = Mapper.fromJson(json).toObject<TestInfo>();
print(info.id); // 输出: 2

将对象转换为 JSON

final info = TestInfo();
info.id = 2;
final json = info.toJson();
print(json); // 输出: { "id": 2 }

高级用法

嵌套对象和列表

如果你的对象包含嵌套对象或列表,你可以这样定义:

class CategoryInfo with Mappable {
  int? id;
  String? name;
  List<BookInfo>? books;

  @override
  void mapping(Mapper map) {
    map("id", id, (v) => id = v);
    map("name", name, (v) => name = v);
    map<List<BookInfo>>("books", books, (v) => books = v);
  }
}

class BookInfo with Mappable {
  int? id;
  String? name;
  String? author;
  DateTime? publishAt;

  @override
  void mapping(Mapper map) {
    map("id", id, (v) => id = v);
    map("name", name, (v) => name = v);
    map("author", author, (v) => author = v);
    map("publish_at", publishAt, (v) => publishAt = v, DateTransform());
  }
}

自定义转换器

你也可以实现自己的转换器来处理特定类型的转换,比如枚举类型:

class EnumTransform<Object extends Enumerable, JSON> with Transformable<Object, JSON> {
  Object fromJson(value) {
    if (value == null || !(value is JSON)) return null;
    return RawRepresentable(Object, value);
  }

  JSON toJson(Object value) {
    if (value == null) return null;
    return value.rawValue;
  }
}

完整示例

以下是完整的示例代码,展示了如何将复杂的 JSON 数据转换为 Dart 对象并反向转换:

import 'package:object_mapper/object_mapper.dart';

void main() async {
  final json = {
    "id": 1,
    "name": "Fantasy",
    "books": [
      {"id": 1, "name": "The Hobbit", "author": "J. R. R. Tolkien", "publish_at": "1937-09-21"},
      {"id": 2, "name": "Harry Potter", "author": "J. K. Rowling", "publish_at": "1997-12-01"}
    ]
  };

  class CategoryInfo with Mappable {
    int? id;
    String? name;
    List<BookInfo>? books;

    @override
    void mapping(Mapper map) {
      map("id", id, (v) => id = v);
      map("name", name, (v) => name = v);
      map<List<BookInfo>>("books", books, (v) => books = v);
    }
  }

  class BookInfo with Mappable {
    int? id;
    String? name;
    String? author;
    DateTime? publishAt;

    @override
    void mapping(Mapper map) {
      map("id", id, (v) => id = v);
      map("name", name, (v) => name = v);
      map("author", author, (v) => author = v);
      map("publish_at", publishAt, (v) => publishAt = v, DateTransform());
    }
  }

  Mappable.factories = {
    CategoryInfo: () => CategoryInfo(),
    BookInfo: () => BookInfo()
  };

  final category = Mapper.fromJson(json).toObject<CategoryInfo>();
  print(category!.toJson());
}

通过以上步骤和示例代码,你应该能够在 Flutter 应用中轻松地使用 object_mapper 进行对象与 JSON 之间的转换。


更多关于Flutter对象映射插件object_mapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter对象映射插件object_mapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,object_mapper 是一个用于对象映射的插件,它可以帮助你在JSON数据和Dart对象之间进行高效的转换。虽然 object_mapper 并不是 Flutter 官方提供的插件,但假设你使用的是某个流行的第三方库(因为Flutter社区中可能有多个实现类似功能的库),下面是一个使用类似功能插件的示例代码。

由于具体的 object_mapper 库可能有所不同,这里我将基于一个假设的 json_serializable 插件(这是Flutter开发中常用的一个库,用于生成JSON序列化和反序列化代码)来展示如何实现对象映射。如果你使用的 object_mapper 插件有特定的API,你可能需要调整下面的代码以适应你的库。

步骤 1: 添加依赖

首先,在你的 pubspec.yaml 文件中添加 json_annotationbuild_runner 的依赖:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.0.1  # 确保使用最新版本

dev_dependencies:
  build_runner: ^2.0.4  # 确保使用最新版本

步骤 2: 创建数据模型

创建一个数据模型类,并使用 @JsonSerializable() 注解。这个注解会告诉 json_serializable 插件需要为这个类生成序列化和反序列化的代码。

import 'package:json_annotation/json_annotation.dart';

part 'user_model.g.dart';  // 生成的代码将会放在这个文件里

@JsonSerializable()
class UserModel {
  final String name;
  final int age;

  UserModel({required this.name, required this.age});

  // 从JSON数据创建UserModel实例的工厂方法
  factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);

  // 将UserModel实例转换为JSON数据
  Map<String, dynamic> toJson() => _$UserModelToJson(this);
}

步骤 3: 生成序列化代码

在你的项目根目录下运行以下命令来生成序列化代码:

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

这个命令会读取你的注解并生成必要的序列化代码,这些代码会被放在你指定的 part 文件中(在这个例子中是 user_model.g.dart)。

步骤 4: 使用对象映射

现在你可以在你的Flutter应用中使用这些生成的序列化和反序列化方法了。

void main() {
  // 创建一个UserModel实例
  UserModel user = UserModel(name: 'Alice', age: 30);

  // 将UserModel实例转换为JSON数据
  Map<String, dynamic> userJson = user.toJson();
  print('User JSON: $userJson');

  // 从JSON数据创建UserModel实例
  Map<String, dynamic> jsonData = {'name': 'Bob', 'age': 25};
  UserModel newUser = UserModel.fromJson(jsonData);
  print('New User: ${newUser.name}, Age: ${newUser.age}');
}

结论

上面的代码示例展示了如何在Flutter中使用 json_serializable 插件来实现对象与JSON数据之间的映射。如果你使用的是名为 object_mapper 的不同插件,请查阅该插件的文档以获取具体的API和用法。通常,这些插件都会提供类似的注解和生成代码的功能,但具体的实现和API可能有所不同。

回到顶部