如何检查Widget是否已挂载

时间:2019-02-03 08:45:35

标签: dart flutter

因此,在我的应用程序中,我想在挂载小部件后立即发出Ajax请求,而不是在initState()中发出请求。与反应

中的ComponentWillMount()类似

5 个答案:

答案 0 :(得分:2)

我认为目前不可能。

这里是mounted属性:https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/framework.dart#L974

bool get mounted => _element != null;

这是设置_element的时间:https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/framework.dart#L3816

_state._element = this

我在此代码上看不到任何钩子会通知我们。

为什么仍然不使用initState?这可能是您想要的。这是mounted属性上方的评论:https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/framework.dart#L967

  /// After creating a [State] object and before calling [initState], the
  /// framework "mounts" the [State] object by associating it with a
  /// [BuildContext]. The [State] object remains mounted until the framework

答案 1 :(得分:1)

   onPressed: () {
      if (mounted) {
        print("mounted");
        setState(
          () => counter(),
        );
      } else {
        print("unmounted");
      }
    },

事实:仅应在检查setState()后实施“if(mounted)”方法,这有助于避免在dispose()之后调用setState()之类的错误。

答案 2 :(得分:0)

如果小部件还没有mounted,则返回。在setState方法之前做

if (!mounted) return;
setState(() {});

if (mounted) {
   //Do something
};
setState(() {});

答案 3 :(得分:0)

只需执行以下操作即可。

if (this.mounted) {
        setState(() {
         //Your code
        });
}

答案 4 :(得分:-1)

如果您想在小部件加载后立即执行一些代码,您可以简单地将此代码放入 initstate 中,如下所示;

 void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) => yourFunction(context));   
 }

这样,yourFunction 会在小部件的第一帧加载到屏幕上时立即执行。