flutter中context.mounted和mounted的区别

问题描述 投票:0回答:1

有人可以解释一下 context.mounted 和 flutter 中安装的区别吗? 我不确定何时使用哪个,所以大多数时候我可以互换使用它们。 请解释一下这个

flutter
1个回答
0
投票

在 Flutter 中,

context.mounted
mounted
用于在执行某些操作(尤其是异步操作)之前检查 widget 是否仍然是 widget 树的一部分。然而,它们的访问方式有所不同。


1。
context.mounted

  • Flutter 3.10中引入,
    context.mounted
    BuildContext
    的实例属性。
  • 它允许检查与给定
    BuildContext
    关联的小部件是否仍然安装(即小部件树的一部分)。
  • 异步回调中很有用,或者当您将
    BuildContext
    传递给另一个函数并想要验证小部件是否仍然处于活动状态时。

2。
mounted

  • Flutter 中
    State
    类的属性。
  • 指示
    State
    对象是否仍处于活动状态且其小部件是否仍在小部件树中。
  • 通常在同一个
    State
    类中使用,以检查执行操作是否安全。

主要区别

  • context.mounted
    BuildContext
    绑定,可以在
    BuildContext
    可用的任何地方访问。
  • mounted
    特定于
    State
    对象,只能在
    State
    类中访问。

示例

使用
context.mounted

import 'package:flutter/material.dart';

class ExampleWidget extends StatefulWidget {
  @override
  State<ExampleWidget> createState() => _ExampleWidgetState();
}

class _ExampleWidgetState extends State<ExampleWidget> {
  Future<void> fetchData(BuildContext context) async {
    // Simulate a network request
    await Future.delayed(Duration(seconds: 2));

    // Use context.mounted to check if the widget is still active
    if (context.mounted) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("Data fetched successfully!")),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Context Mounted Example")),
      body: Center(
        child: ElevatedButton(
          onPressed: () => fetchData(context),
          child: Text("Fetch Data"),
        ),
      ),
    );
  }
}

使用
mounted

import 'package:flutter/material.dart';

class ExampleWidget extends StatefulWidget {
  @override
  State<ExampleWidget> createState() => _ExampleWidgetState();
}

class _ExampleWidgetState extends State<ExampleWidget> {
  bool _loading = false;

  Future<void> fetchData() async {
    setState(() {
      _loading = true;
    });

    // Simulate a network request
    await Future.delayed(Duration(seconds: 2));

    // Use mounted to check if the widget is still active
    if (mounted) {
      setState(() {
        _loading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Mounted Example")),
      body: Center(
        child: ElevatedButton(
          onPressed: _loading ? null : fetchData,
          child: Text(_loading ? "Loading..." : "Fetch Data"),
        ),
      ),
    );
  }
}

何时使用

  • 在异步操作中处理
    BuildContext
    或将其传递给另一个函数时,请使用 context.mounted
  • 使用
    mounted
    State
    类中进行简单的状态管理。

两者对于避免与小部件树中可能不再存在的小部件交互时出现潜在错误至关重要。

© www.soinside.com 2019 - 2024. All rights reserved.