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方法,InheritedElementupdateDependencies方法,setDependencies方法。将自己注册到父InheritedElement_dependents中。

InheritedElement重建时会调用updated方法,然后会调用到notifyClients方法,最终调用Widget didChangeDependencies方法并重建子Widget

由上边的代码可以看出,只有当子Widget调用了dependOnInheritedWidgetOfExactType才会收到InheritedWidget的重建通知。