Flutter 开发实战

235课时
1K学过
8分

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
1分钟

02 scoped_model-2

如下图所示,在 scoped_model 的整个实现流程中,ScopedModel 这个 Widget 很巧妙的借助了 AnimatedBuildler

因为 AnimatedBuildler 继承了 AnimatedWidget ,在 AnimatedWidget 的生命周期中会对 Listenable 接口添加监听,而 Model 恰好就实现了 Listenable 接口,整个流程总结起来就是:

  • Model 实现了 Listenable 接口,内部维护一个 Set _listeners
  • Model 设置给 AnimatedBuildler 时, ListenableaddListener 会被调用,然后添加一个 _handleChange 监听到 _listeners 这个 Set 中。
  • Model 调用 notifyListeners 时,会通过异步方法 scheduleMicrotask 去从头到尾执行一遍 _listeners 中的 _handleChange
  • _handleChange 监听被调用,执行了 setState({})

image.png

整个流程是不是很巧妙,机制的利用了 AnimatedWidgetListenable 在 Flutter 中的特性组合,至于 ScopedModelDescendant 就只是为了跨 Widget 共享 Model 而做的一层封装,主要还是通过 ScopedModel.of(context) 获取到对应 Model 对象,这这个实现上,scoped_model 依旧利用了 Flutter 的特性控件 InheritedWidget 实现。