1分钟
02 scoped_model-2
如下图所示,在 scoped_model
的整个实现流程中,ScopedModel
这个 Widget 很巧妙的借助了 AnimatedBuildler
。
因为 AnimatedBuildler
继承了 AnimatedWidget
,在 AnimatedWidget
的生命周期中会对 Listenable
接口添加监听,而 Model
恰好就实现了 Listenable
接口,整个流程总结起来就是:
Model
实现了Listenable
接口,内部维护一个Set _listeners
。- 当
Model
设置给AnimatedBuildler
时,Listenable
的addListener
会被调用,然后添加一个_handleChange
监听到_listeners
这个 Set 中。 - 当
Model
调用notifyListeners
时,会通过异步方法scheduleMicrotask
去从头到尾执行一遍_listeners
中的_handleChange
。 _handleChange
监听被调用,执行了setState({})
。
整个流程是不是很巧妙,机制的利用了 AnimatedWidget
和 Listenable
在 Flutter 中的特性组合,至于 ScopedModelDescendant
就只是为了跨 Widget 共享 Model
而做的一层封装,主要还是通过 ScopedModel.of(context)
获取到对应 Model 对象,这这个实现上,scoped_model
依旧利用了 Flutter 的特性控件 InheritedWidget
实现。
学员评价