Flutter InheritedWidget源码解析
作用
InheritedWidget
是一个在Widget
树中,从上往下传递信息的小部件。
主要从两个方面理解源码:
1.子Widget
可以获取到父控件中的InheritedWidget
,从而获取到InheritedWidget的信息。
2.子Widget
调用dependOnInheritedWidgetOfExactType
后,当父InheritedWidget
重建后,会调用子控件重建。
原理
1.子控件可以获取到父控件中的InheritedWidget
在Element
中有个Map:
其中保存了该Widget
的父节点中的InheritedWidget
。会在mount
`activate`
方法中赋值,赋值的代码如下:
在Element
中
在InheritedElement
中
经过上面两个方法,Widget
本身就可以通过_inheritedWidgets
获取到InheritedElement
了
2.子Widget
调用dependOnInheritedWidgetOfExactType
后,当父InheritedWidget
重建后,会调用子控件重建
在InheritedElement
中有个Map:
当子Widget
调用dependOnInheritedWidgetOfExactType
方法时,会依次调用dependOnInheritedElement
方法,InheritedElement
的updateDependencies
方法,setDependencies
方法。将自己注册到父InheritedElement
的_dependents
中。
当InheritedElement
重建时会调用updated
方法,然后会调用到notifyClients
方法,最终调用Widget didChangeDependencies
方法并重建子Widget
。
由上边的代码可以看出,只有当子Widget调用了dependOnInheritedWidgetOfExactType才会收到InheritedWidget的重建通知。