flutter - 如何在我的 ValueNotifier 中使用 Dart 类的字段作为值?
问题描述
我正在尝试在上一个项目中使用 ValueNotifier 类。我试图将我的类设置为 ValueNotifier 对象的类型:这是我正在处理的片段:
final ValueNotifier<Person> p = ValueNotifier<Person>(Person());
ValueListenableBuilder(
builder: (BuildContext context, Person value, Widget child) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text('${value.marriageStatus}'),
],
);
},
valueListenable: p,
),
enum marriageStatus {
SINGLE,
MARRIED,
WIDOW
}
class Person{
marriageStatus marriageState = marriageStatus.SINGLE;
//Constructor
Person(){
print("Constructor without arguments");
}
//Getters
marriageStatus get currentState{
return marriageState;
}
}
正如我后来发现的那样,它没有捕捉到类字段的变化。我想设置为valueListenable,p.marriageState
以便在状态更改时更改文本。
我的问题是:
我可以以其他方式使用 ValueNotifier 来工作还是应该使用其他类?(如 ChangeNotifier)
谢谢
更新 2021-02-22
我根据建议更改了代码,以覆盖 == 运算符并检查字段中的更改,但它仍然不起作用。
enum marriageStatus {
SINGLE,
MARRIED,
WIDOW
}
class Person extends Equatable {
marriageStatus marriageState = marriageStatus.SINGLE;
//Constructor
Person(){
print("Constructor without arguments");
}
//Getters
marriageStatus get currentState{
return marriageState;
}
@override
List<Object> get props => [marriageState];
}
class _MyHomePageState extends State<MyHomePage> {
bool flag = true;
void changeStatus(){
if(flag){
p.value.marriageState = marriageStatus.SINGLE;
flag = false;
print("the name is ${p.value.marriageState}");
}
else{
p.value.marriageState = marriageStatus.WIDOW;
flag = true;
print("the name is ${p.value.marriageState}");
}
}
ValueNotifier<Person> p = ValueNotifier<Person>(Person());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title)
),
body: Center(
child:
ValueListenableBuilder(
builder: (BuildContext context, Person value, Widget child) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text('${value.marriageState}'),
],
);
},
valueListenable: p,
)
),
bottomNavigationBar: FlatButton(
child: Text("changeStatus"),
onPressed: changeStatus,
),
);
}
}
解决方案
推荐阅读
- c# - 获取嵌入式资源文件位置
- excel - 如何在 Outlook 约会中创建超链接?
- react-native - Flatlist里面的Flatlist:从父Flatlist获取数据
- amazon-web-services - 7 天后删除 Datadog 日志
- mysql - SQL 查询按天、日期和潜在客户计数排序
- java - 如何使用 AWS CLI 2 将更新的 JAR 上传到现有 Java Elastic Beanstalk 实例?
- shell - 在 GCP kubernetes 集群中安装持久化 cli 命令
- ios - libc++abi.dylib:以 NSException (lldb) 类型的未捕获异常终止错误
- c++ - Win32 程序更改笔记本电脑刷新率 - 崩溃
- sql - JOINING the Same Tables in SQL