文章目录
一、前言
在Flutter中如果想使用数据类保存json数据的话要麻烦一些,本篇主要是将其中的开发过程以及遇到的一些问题进行记录
二、相关依赖:
使用序列化需要添加依赖,依赖如下:
dependencies:
# Your other regular dependencies here
json_annotation: <latest_version>
dev_dependencies:
# Your other dev_dependencies here
build_runner: <latest_version>
json_serializable: <latest_version>
三、简单的示例代码
里面有一些代码可以直接从这里进行复制改下类名既可以,代码如下:
user.dart //文件名记得小写
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';//这行代码先写上,后面会编译项目后会根据这个名字进行生成
@JsonSerializable()
class User {
User(this.name, this.email);//必须要有构造函数,可以是空构造函数,但是如果构造函数里面写参数的话记得给默认值
String name;
String email;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);//用来将json内容转换为实体类,记得改下名字
Map<String, dynamic> toJson() => _$UserToJson(this);//用来实体类转换为json,记得改下名字
}
四、嵌套类的代码示例代码
对于嵌套类来说,两个类不可以写在一个文件里面,对于其它语言中对于某些比较小的类写在一个文件中的写法这里不能使用
user.dart
import 'address.dart';
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable(explicitToJson: true)//注意该参数
class User {
String firstName;
Address address;
User(this.firstName, this.address);
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
address.dart
import 'package:json_annotation/json_annotation.dart';
part 'address.g.dart';
@JsonSerializable()
class Address {
String street;
String city;
Address(this.street, this.city);
factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);
Map<String, dynamic> toJson() => _$AddressToJson(this);
}
五、继承类的写法
继承类的写法跟普通写法没有多大区别
六、生成.g文件
在上述文件中文件中需要生成.g
文件。主要有以下两种方式:
1、一次生成的话使用终端在根目录执行以下命令:
flutter pub run build_runner build
2、持续生成的话使用终端在根目录执行以下命令:
flutter pub run build_runner watch
七、使用build_runner后续生成新文件的问题
当使用一次生成的话,后续有新的文件生成会遇到如下错误
These outputs must be removed manually or the build can be run with `--delete-conflicting-outputs`
对于该问题才有以下命令进行解决
flutter packages pub run build_runner clean
flutter packages pub run build_runner build --delete-conflicting-outputs
八、intl与build_runner的冲突问题
当使用国际化时候,如果在使用build_runner会出现缺少.dart_tool/flutter_gen/pubspec.yaml
文件的问题,对于该问题新建一个名字叫pubspec.yaml
的空文件即可
九、数据类的默认值问题
官网上给的代码一般会在构造函数里面写上变量,但是没有默认值。所以,如果定义的变量有默认值,但是构造函数里面没有默认值,在用的时候默认值还是为null。除非,定义时候赋默认值后,定义空构造函数或者构造函数里面也写上默认值。(建议用空构造函数,这样会简单些)