Flutter模型序列化插件serializable_models的使用
Flutter模型序列化插件serializable_models的使用
特性
- 创建一个基于你模型的可序列化的扩展模型。
可能还会有与之配套的库,例如serializable_models_rest
和 serializable_models_sqlite
。
开始使用
在你的pubspec.yaml
文件中添加serializable_models
包,并将build_runner
添加到开发依赖项中。
运行以下命令来生成代码:
flutter pub run build_runner build
使用方法
- 当需要在生成的代码中使用构造函数时,第一个构造函数会被使用。确保你创建了一个。
- 类必须是私有的,声明一个部分,抽象并扩展
SerializableModelBase
。 - 如果你需要更改字段的序列化方式,你必须直接修改库。这在未来可能会改变。
以下是最简单的示例。要查看更多,可以查看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
更多关于Flutter模型序列化插件serializable_models的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
serializable_models
是一个用于 Flutter 的代码生成插件,它可以帮助你自动生成模型类的序列化和反序列化代码。通过使用这个插件,你可以减少手写样板代码的工作量,并确保代码的一致性和可维护性。
安装步骤
-
添加依赖: 首先,你需要在
pubspec.yaml
文件中添加serializable_models
和build_runner
依赖。dependencies: flutter: sdk: flutter serializable_models: ^0.0.1 # 请根据实际情况使用最新版本 dev_dependencies: build_runner: ^2.1.0
-
创建模型类: 接下来,创建一个模型类,并添加
[@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, }); }
-
生成代码: 使用
build_runner
生成序列化和反序列化代码。在终端中运行以下命令:
flutter pub run build_runner build
这将会生成一个
user_model.g.dart
文件,其中包含了UserModel
类的序列化和反序列化代码。 -
使用生成的代码: 你可以在你的应用程序中使用生成的代码来序列化和反序列化
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, }); }