在initState中调用SetState的重要性

时间:2018-11-18 17:44:07

标签: flutter

应该在setState()的{​​{1}}方法内部调用initState()方法吗?

我的理解是StatefullWidget方法将自动应用状态。

下面的代码不起作用。 post对象的值为空。

initState()

但是以下方法可行。

  @override
  void initState() {
    ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
        post = ItemService.getPostFromDocument(doc);
    });
  }

在某些情况下,即使在同一类中不使用 @override void initState() { ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){ setState((){ post = ItemService.getPostFromDocument(doc); }); }); } ,也都可以正常工作。

那么我什么时候应该在setState()方法中使用setState(),什么时候不使用?

另一个相关问题:

我何时应该在initState()内部打电话给super.initState()?我不打扰有关系吗?

2 个答案:

答案 0 :(得分:3)

您不需要在initState中使用setState。实际上,如果您这样做,将无法正常工作。

问题是,在示例中,您不是在setState中调用initState

您要做的是在异步事件上调用setState。但是由于它是异步的,所以initState方法已经完成

答案 1 :(得分:3)

setState()方法通知框架有状态窗口小部件的内部状态已更改。调用此方法将触发窗口小部件以最新状态值进行重建,因此无需在initState()生命周期方法内调用它,因为仅当窗口小部件插入窗口小部件树中时才被调用一次(即小部件初始化时)。

您可以在此处详细了解setState()方法:setState method

对于initState()生命周期方法,每当您覆盖此方法时,您必须在方法的开始或结束处调用super.initState();,否则,您会遇到一些问题。小部件出现问题。诸如未将小部件插入小部件树的问题。

您只能在setState()中使用initState(),就像在第二个代码片段中那样,它是在回调函数中。之所以起作用,是因为在运行回调时,该窗口小部件已经被初始化并插入到窗口小部件树中,并且内部状态需要更新以触发重建。

此外,请注意,setState()仅在安装了小部件时才起作用。因此,每个窗口小部件都有一个bool this.mounted属性,如果不确定在调用setState()时是否仍会挂载该窗口小部件,可以检查该属性。未挂载窗口小部件时调用它可能会使您的应用程序崩溃。因此,建议不要在小部件类外部调用setState()