为什么在没有新的类有状态小部件屏幕实例的情况下也"this"更改?



我有一个屏幕作为statefull小部件。当我引用它时;这个";如预期的那样,在initState和构建方法中。但是,如果从那个屏幕,我打开一个新的屏幕,然后回到第一个屏幕,首先状态完整的小部件屏幕似乎没有恢复,方法initState不会再次调用,但方法build被调用(正如预期的那样,屏幕必须再次绘制(,并且它有一个新";这个";与第一次显示屏幕相比。我也可以接受screen类有一个新的this,但如果没有screen小部件的新实例,它怎么可能呢?似乎这个阶级改变了它的";这个";没有该类的新实例。有可能吗?为什么?我错了吗?

通过flutter的有状态initstate 的文档

当此对象插入到树中时调用。

框架将为它创建的每个State对象只调用一次此方法。

这意味着当您第一次添加有状态小部件时,会调用此方法并创建此(实例(。。

现在在各种情况下调用构建方法

框架在许多不同的情况下调用此方法。例如:

  • 调用initState之后
  • 调用didUpdateWidget后
  • 在收到对setState的调用后
  • 在该State对象的依赖项更改后(例如,以前的构建更改所引用的InheritedWidget(
  • 调用deactivate,然后在另一个位置将State对象重新插入树中

因此,每次调用构建时,如果您在构建方法中添加了创建实例的代码,就会创建一个新实例。

当您移动到下一页时,第一个屏幕仍然在小部件树中。然后你弹出屏幕2,你会看到屏幕1,但这次它没有添加到小部件树中,所以只调用构建。。如果您从屏幕2执行navigator.push并导航到屏幕1,您将看到initstate再次被调用,因为screen1的一个新实例已添加到小部件树中。。

最新更新