Flutter中使用@freezed时如何访问类的成员变量进行操作?
Freezed类成员变量访问解决方案
1. 先完成代码生成
写完Freezed类定义后必须先执行构建命令生成对应的适配代码,IDE才能识别生成的成员变量,命令如下:
flutter pub run build_runner build
生成成功后,默认构造的name、age字段就可以直接通过实例访问。
2. 成员变量访问方式
因为你定义了多工厂构造的联合类型,不同构造的实例字段不同,对应两种访问方式:
- 确定实例构造类型时,直接强转后访问即可:
void method() { print('hello world'); Person p = Person("name", age: 20); // 强转为默认构造的实现类后访问字段 final normalP = p as _Person; print(normalP.name); // 输出name print(normalP.age); // 输出20 Person manager = Person.manager("管理员"); final m = manager as Manager; print(m.ttt); // 输出管理员 }
- 不确定实例构造类型时,用Freezed自带的模式匹配方法安全访问,避免类型转换异常:
Person p = getPersonFromFirebase(); p.when( (name, age) => print("普通用户:$name,年龄$age"), manager: (ttt) => print("管理员标识:$ttt"), );
3. 对接Firebase的补充配置
如果要对接Firebase数据库,需要补充Json序列化配置,完整的类定义如下:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'person.freezed.dart'; part 'person.g.dart'; @freezed class Person with _$Person { const Person._(); const factory Person(String name, {int? age}) = _Person; const factory Person.manager(String? ttt) = Manager; // 新增Json序列化方法,对接Firebase数据转换 factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json); }
注意:Dart文件和part引入的文件名建议统一用小写加下划线格式,避免不同操作系统大小写敏感导致的引入错误。
内容的提问来源于stack exchange,提问作者Yerbol Kistaubayev
相关产品推荐
相关产品推荐

