如何在Flutter中检查Widget是否已挂载

26

在我的应用程序中,我想在挂载小部件时立即发出一个Ajax请求,而不是在initState()中。类似于React中的componentWillMount()


3
这个链接这个链接可能会有所帮助。 - Jerome Escalante
6个回答

44

如果Widget没有mounted,则返回。在setState方法之前执行。

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

或者

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


2
"在mounted不为true时调用setState是错误的。"
  • 官方文档.. https://api.flutter.dev/flutter/widgets/State/mounted.html
- iamnabink

19
如果您想在小部件加载后立即执行一些代码,只需像以下示例中那样将此代码放入initstate中即可;
 void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) => yourFunction(context));   
 }

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


这是翻译后的文本。 - Akbar Noto

8
我认为目前还不可能。 这是`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

8

只需按照以下步骤进行即可。

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

6

在最新的更新中,Flutter 3.7,你可以直接使用context来检查widget是否已经挂载。以下是一个示例用法:

@override
  Widget build(BuildContext context) {
    return OutlinedButton(
      onPressed: () async {
        await Future<void>.delayed(const Duration(seconds: 1));
        if (context.mounted) {
          Navigator.of(context).pop();
        }
      },
      child: const Text('Delayed pop'),
    );
  }

详情请参考此页面


1
我知道这个答案有点晚了,但是...
在你的方法内部,应该有类似于这样的代码:
if(mounted){
   setState(() {});
 }

如果有任何更改,这将有助于仅重新构建UI。我自己在一个方法中使用它,从Firestore中填充用户列表。

mounted属性有助于避免在构建之前调用setState时出错。


4
检查布尔值不需要布尔运算符。 - Mudassir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接