03 InheritedWidget
在 scoped_model
中我们可以通过 ScopedModel.of(context)
获取我们的 Model ,其中最主要是因为其内部的 build 的时候,包裹了一个 _InheritedModel
控件,而它继承了 InheritedWidget
。
为什么我们可以通过 context
去获取到共享的 Model
对象呢?
首先我们知道 context
只是接口,而在 Flutter 中 context
的实现是 Element
,在 Element
的 inheritFromWidgetOfExactType
方法实现里,有一个 Map _inheritedWidgets
的对象。
_inheritedWidgets
一般情况下是空的,只有当父控件是 InheritedWidget
或者本身是 InheritedWidgets
时才会有被初始化,而当父控件是 InheritedWidget
时,这个 Map 会被一级一级往下传递与合并 。
所以当我们通过 context
调用 inheritFromWidgetOfExactType
时,就可以往上查找到父控件的 Widget,从在 scoped_model
获取到 _InheritedModel
中的Model
。
学员评价