Flutter模型序列化插件serializable_models的使用

Flutter模型序列化插件serializable_models的使用

特性

  • 创建一个基于你模型的可序列化的扩展模型。

可能还会有与之配套的库,例如serializable_models_restserializable_models_sqlite

开始使用

在你的pubspec.yaml文件中添加serializable_models包,并将build_runner添加到开发依赖项中。

运行以下命令来生成代码:

flutter pub run build_runner build

使用方法

  1. 当需要在生成的代码中使用构造函数时,第一个构造函数会被使用。确保你创建了一个。
  2. 类必须是私有的,声明一个部分,抽象并扩展SerializableModelBase
  3. 如果你需要更改字段的序列化方式,你必须直接修改库。这在未来可能会改变。

以下是最简单的示例。要查看更多,可以查看example/lib/models目录下的文件,展示了一些不带生成代码的模型,以及所有生成时的选项。

示例代码

import 'package:serializable_models/annotations.dart';
import 'package:serializable_models/model_base.dart';

part 'item.o.dart';

@SerializableModel()
abstract class _Item extends SerializableModelBase {
  @Pk()
  int id;
  String name;

  _Item({
    required this.id,
    required this.name,
  });
}

运行构建后,会生成以下内容: lib/models/item.o.dart

// Source library: package:example/models/item.dart

part of 'item.dart';

class Item extends _Item {
  [@override](/user/override)
  get pk => id;

  Item({
    required int id,
    required String name,
  }) : super(
    id: id,
    name: name,
  );

  factory Item.fromSerializable(Map<String, dynamic> from) {
    var instance = Item(
      id: from["id"],
      name: from["name"],
    );

    return instance;
  }

  [@override](/user/override)
  Item clone() {
    return Item(
      id: id,
      name: name,
    );
  }

  [@override](/user/override)
  void loadSerializable(Map<String, dynamic> from) {
    id = from["id"];
    name = from["name"];
  }

  [@override](/user/override)
  Map<String, dynamic> toSerializable() {
    return {
      "id": id,
      "name": name,
    };
  }
}

完整示例

import 'package:flutter/material.dart';
import 'package:your_package_name/models/item.dart'; // 假设你的模型类位于此路径下

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  Item item = Item(id: 1, name: "Test Item");

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            Text(
              'Item ID: ${item.id}',
              style: Theme.of(context).textTheme.headline4,
            ),
            Text(
              'Item Name: ${item.name}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter模型序列化插件serializable_models的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模型序列化插件serializable_models的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


serializable_models 是一个用于 Flutter 的代码生成插件,它可以帮助你自动生成模型类的序列化和反序列化代码。通过使用这个插件,你可以减少手写样板代码的工作量,并确保代码的一致性和可维护性。

安装步骤

  1. 添加依赖: 首先,你需要在 pubspec.yaml 文件中添加 serializable_modelsbuild_runner 依赖。

    dependencies:
      flutter:
        sdk: flutter
      serializable_models: ^0.0.1  # 请根据实际情况使用最新版本
    
    dev_dependencies:
      build_runner: ^2.1.0
    
  2. 创建模型类: 接下来,创建一个模型类,并添加 [@Serializable](/user/Serializable)() 注解。

    import 'package:serializable_models/serializable_models.dart';
    
    part 'user_model.g.dart';
    
    [@Serializable](/user/Serializable)()
    class UserModel {
      final String name;
      final int age;
      final String email;
    
      UserModel({
        required this.name,
        required this.age,
        required this.email,
      });
    }
    
  3. 生成代码: 使用 build_runner 生成序列化和反序列化代码。

    在终端中运行以下命令:

    flutter pub run build_runner build
    

    这将会生成一个 user_model.g.dart 文件,其中包含了 UserModel 类的序列化和反序列化代码。

  4. 使用生成的代码: 你可以在你的应用程序中使用生成的代码来序列化和反序列化 UserModel 对象。

    void main() {
      var user = UserModel(name: 'John Doe', age: 30, email: 'john.doe@example.com');
    
      // 序列化
      var json = user.toJson();
      print(json);
    
      // 反序列化
      var userFromJson = UserModel.fromJson(json);
      print(userFromJson.name);
    }
    

高级用法

  • 自定义字段名称: 你可以使用 @SerializedName 注解来自定义 JSON 字段名称。

    [@Serializable](/user/Serializable)()
    class UserModel {
      @SerializedName('user_name')
      final String name;
    
      @SerializedName('user_age')
      final int age;
    
      UserModel({
        required this.name,
        required this.age,
      });
    }
    
  • 嵌套对象: 你可以嵌套其他可序列化的对象。

    [@Serializable](/user/Serializable)()
    class Address {
      final String city;
      final String country;
    
      Address({
        required this.city,
        required this.country,
      });
    }
    
    [@Serializable](/user/Serializable)()
    class UserModel {
      final String name;
      final int age;
      final Address address;
    
      UserModel({
        required this.name,
        required this.age,
        required this.address,
      });
    }
    
  • 忽略字段: 你可以使用 @Ignore 注解来忽略某些字段。

    [@Serializable](/user/Serializable)()
    class UserModel {
      final String name;
      final int age;
    
      @Ignore()
      final String secret;
    
      UserModel({
        required this.name,
        required this.age,
        required this.secret,
      });
    }
回到顶部