flutter 如何监控一个变量的变化,如js的watch

####背景:

需要在一个页面里面加ga,统计页面里面banner的访问量,banner有一定的条件显示和隐藏。

####架构:

一个页面主widget,一个子widget banner,通过子widget的 show字段控制banner的显示隐藏。双向绑定。
在主widget只需要改show的值就可以控制banner。但要加访问量ga,没有想android里面有setShow的方法可以加。

####思路:

监控show变量值的变化,然后当show变成true的时候统计ga访问量。

####block:

flutter里面没有watch关键词,最后找到一种类似watch的字段,叫ValueNotifier和ValueListenableBuilder

####解决思路:

根据show创建一个ValueNotifier,

1
2
final bool show;
_showNotifier = ValueNotifier<bool>(show);

看到ValueNotifier有方法addListener,removeListener
以为可以直接监听,从而变量用ValueNotifier包装后直接监听,很方便

但事实上当变量show变化的时候,是监听不到任何回调的,后来发现addListener是需要动作触发的,即使用_showNotifier.value(true),可以监听到回调。这并不是我想要的。

所以继续找,发现一种可以收到回调,需要在widget树上使用ValueListenableBuilder,通过变量到widget树到监听回调,才能走完闭环。

1
2
3
4
5
6
7
8
9
ValueListenableBuilder(
builder: (BuildContext context, bool value, Widget child) {
if (this.widget.show) {
GaUtil.sendEvent(name: ‘’);
}
return buildRootWidget();
},
valueListenable: this.widget._showNotifier,
);