首先我们明确一点,父元件的重构,会导致其所有子元件重构。当元件为状态元件时,状态改变并发出通知,子元件会响应通知,全部重构子树,注意,状态元件本身实例是不是会变化的,除非它的父元件重构了它。另外,无论视图上有没有用到状态,状态元件的子树所有元件例无一外地执行build()方法重构。
这就是:setState 后必然会 build,必然会导致子树全部重构;
然后是关于这三个与State有关的元件的生命周期有关的钩子函数:
State.didChangeDependencies()
这个方法在何种情形会调用?要看它的祖先(或上级)元件,如果它的某一级祖先是SomeInheritedWidget,而且它本身内部使用SomeInheritedWidget的数据,当这个祖先SomeInheritedWidget实例被换了时,此方法会被它的State调用。换个说法就是它所依赖的祖先变换了一个新的实例。
State.didUpdateWidget()
这个方法在何时会调用?比较简单,看它自己的实例是换了一个新的实例,如果是,此方法会被它的State调用。换名说话就是它自己变换了一个新的实例。
InheritedWidgets.updateShouldNotify()
这个方法存在于SomeInheritedWidget中,是一个重写方法。如果总是返回false,那么,它的下级元件中如果有Stateful元件,且State中调用了它的数据,它自己的实例在树中不管变没变,State.didChangeDependencies()永远不会调用。