2.16 深入学习生命周期
这节我们学习生命周期,首先有两种不同的小部件,分别是StatelessWidget和StatefulWidget。StatelessWidget是无状态小部件,可以在UI上渲染内容,也可以给它传数据。在App中News是无状态小部件。我们通过NewsManager小部件给News传入数据并让它发生改变,然后渲染到屏幕上。
StatefulWidget是有状态的小部件,可以用它渲染UI、从外部接收数据,同时还可以改变小部件中的内部数据,然后重新渲染。所以改变外部传入的数据和改变内部的状态数据都可以重新渲染UI,如图2.23所示。
图2.23 有状态小部件和无状态小部件的重新渲染方式对比
小部件有生命周期,StatelessWidget和StatefulWidget生命周期不同。生命周期代表Flutter执行小部件类中的方法的过程。StatelessWidget有构造器方法和build()方法,这两个方法只有StatelessWidget在生命的周期中时才会被调用。当外部的数据变化时,build()方法被再次执行。
StatefulWidget同样也有构造器方法,在调用build()方法之前调用initState()方法,initState()方法只调一次。同时可以在build()方法中调用setState()方法,确切地说是当某些事情发生变化的时候会调用它,例如单击按钮等。
当传给StatefulWidget的外部数据发生变化时,会调用did UpdateWidget()方法。例如在上一节中,如果传入的startingNews发生了改变,先调用了did UpdateWidget()方法,再调用了build()方法,由此可见StatefulWidget的生命周期比较复杂,如图2.24所示。
图2.24 小部件的生命周期