Flutter unicreators/mvvm库:$watch与$watchFor方法区别解析
unicreators/mvvm库中$watch与$watchFor的区别解析
结合你提供的代码示例,这两个方法的核心区别可以从以下几个维度区分:
1. 观察目标的类型与来源
- $watch:直接接收一个
BindableProperty实例作为观察对象。比如示例中的model.timer$,它是ViewModel类中直接声明的BindableProperty.$tick实例,属于ViewModel的公开成员,可以直接引用。 - $watchFor:接收一个
Symbol类型的键(如示例中的#counter),这个键对应ViewModel内部通过registerProperty方法注册的BindableProperty。这类属性没有直接暴露为ViewModel的公开成员,而是通过Symbol键进行访问。
2. 使用场景
- $watch:适合处理ViewModel中预先定义好的公开绑定属性,属性本身是ViewModel的一个字段,无需额外注册,直接引用即可建立观察。
- $watchFor:适合处理ViewModel中动态注册或内部维护的绑定属性,这类属性通过
registerProperty注册,避免直接暴露字段,更适合封装性要求较高的场景。
3. 调用方式
- $watch:是
View类的内置方法,在View的build方法中直接调用即可(示例中直接写$watch<int>(...))。 - $watchFor:是
ViewModel类的方法,必须通过ViewModel实例调用(示例中是model.$watchFor<int>(...))。
代码对应示例说明
- 对于
timer$:它是ViewModel中直接声明的BindableProperty,所以用$watch直接观察这个实例的变化,更新显示计时器文本。 - 对于
#counter:它是在ViewModel的init方法里通过registerProperty注册的属性,没有直接暴露为字段,所以通过model.$watchFor传入Symbol键#counter来观察其值的变化,更新点击次数文本。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

