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的重建通知。