首页 > 解决方案 > 如何在我的 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;
  }
}

正如我后来发现的那样,它没有捕捉到类字段的变化。我想设置为valueListenablep.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,
            ),
    );
  }
}

标签: flutterdart

解决方案


推荐阅读