成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于 Flutter 中 Mounted 屬性您需要了解的一切

開發 前端
我在 StackOverflow 上看到很多關于無論如何都要在任何地方使用 mounted 屬性的必要性的問題。請記住,使用 mounted 屬性不是強制性的,但這是一個很好的做法。在特殊情況下使用的良好實踐。

今天,我們來回顧一下 Flutter 中對于保證 widget 交互穩定性起著重要作用的一個屬性。該屬性的名稱是 mounted。

什么是已 mounted 屬性?

Mounted 屬性是 Flutter 框架在 State 類中提供的布爾標志。它指示狀態對象當前是否在小部件樹中。

創建 State 對象之后、調用 initState 之前,框架通過將 State 對象與 BuildContext 關聯來“mounted”該對象。State 對象保持掛載狀態,直到框架調用 dispose,之后框架將不再要求 State 對象再次構建。換句話說,當一個 widget 從 widget 樹中刪除時,其關聯的狀態對象也被刪除,并且 mounted 屬性被設置為 false。

mounted 屬性的目的是什么?

Mounted 屬性的主要目的是幫助您管理狀態并避免與不再屬于小部件樹一部分的小部件交互時可能發生的潛在錯誤。具體來說,mounted 在涉及異步操作或延遲操作的場景中很有用。

何時使用 Mounted 屬性?

我認為應該把第一名讓給異步操作。

當執行異步操作(例如網絡請求、數據庫查詢)時,一旦操作完成,狀態對象可能會被更新。但是,如果在操作完成之前將小部件從小部件樹中刪除,則嘗試更新狀態可能會導致運行時錯誤。在這種情況下,mounted 屬性允許您在進行任何更新之前檢查狀態對象是否仍然處于活動狀態。

String _data = '';
bool _isFetching = false;

@override
 void initState() {
   super.initState();
   _fetchData();
 }

void _fetchData() async {
  // assuming that _isFetching is a boolean that tracks the loading state
  setState(() {
    _isFetching = true;
  });

  try {
    final data = await fetchDataFromServer();
    if (mounted) {
      setState(() {
        _data = data;
        _isFetching = false;
      });
    }
  } catch (error) {
    if (mounted) {
      setState(() {
        _isFetching = false;
        _error = error;
      });
    }
  }
}

異步操作完成后,我們在調用 setState 之前檢查 Mounted 屬性。這確保了小部件仍然是小部件樹的一部分。

為什么這很重要?同樣,如果小部件已從樹中刪除(例如,由于導航離開頁面或小部件被處置),調用 setState 將導致運行時錯誤。在這里,我們的輔助 Mounted 屬性通過確認小部件仍然處于活動狀態并且可以安全更新來防止這種情況發生。

讓我們進入下一個環節:計時器和延遲操作、動畫。

當使用計時器、延遲操作或動畫時,小部件可能會在計時器或操作完成之前被丟棄。如果在調用 setState 之前檢查 mounted 屬性,就能確保只有在部件仍處于活動狀態時才進行更新。

void _startTimer() {
  Timer.periodic(Duration(seconds: 1), (timer) {
    if (mounted) {
      setState(() {
        _counter++;
      });
    }
  });
}

在 dispose 方法中,清理任何資源或取消正在進行的操作至關重要。由于當小部件即將從小部件樹中刪除時會調用 dispose,因此最好在執行可能依賴于小部件狀態的操作之前檢查 mounted 屬性是一個很好的做法。

@override
void dispose() {
  _timer?.cancel();
  super.dispose();
}

另一個是:Navigator。

如果要執行可能被導航中斷的異步操作(如使用 Navigator.push 或 Navigator.pop),請確保在更新狀態前掛載部件。

Future<void> _navigateAndFetchData() async {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => AnotherPage()),
  );

  final result = await someAsyncOperation();
  if (mounted) {
    setState(() {
      _data = result;
    });
  }
}

我想討論的最后一個是:具有異步初始化的有狀態小部件。

對于在 initState 中執行異步操作的有狀態小部件,最好使用 Mounted 屬性來確保僅在小部件處于活動狀態時才發生更新。

@override
void initState() {
  super.initState();
  _initializeAsync();
}

Future<void> _initializeAsync() async {
  final data = await fetchData();
  if (mounted) {
    setState(() {
      _data = data;
    });
  }
}

好吧好吧,這是最后一篇:長時間運行的操作。

對于長時間運行的任務,例如文件 I/O 或計算,您可以在調用 setState 之前使用 Mounted 屬性來確保 UI 更新是安全的。

Future<void> performLongRunningTask() async {
  await longRunningTask();
  if (mounted) {
    setState(() {
      _taskCompleted = true;
    });
  }
}

為什么要使用 Mounted 屬性?

如果總結我們的討論,我們得到的是:

  • 防止運行時錯誤:在不檢查 mounted 的情況下,存在嘗試更新已刪除的小部件的風險,從而導致運行時異常。這在操作完成時間不可預測的異步操作中尤其常見。
  • 生命周期管理:mounted 屬性提供了一種管理 widget 生命周期的方法,確保只有在 widget 處于活動狀態時才執行操作。
  • 效率:通過避免對非活動部件進行不必要的更新,mounted 屬性有助于有效管理資源,從而提高應用程序的性能。

什么時候 mounted 屬性可能不是必需的?

同步操作:用于不涉及異步任務或后臺操作的純同步操作。然而,確保適當的資源管理并避免在小部件處置期間更新狀態仍然很重要。

簡單小部件:適用于不涉及任何異步邏輯、后臺任務或復雜生命周期管理的簡單小部件。

在 Flutter 3.7 中使用 context.mounted

在 Flutter 3.7 之前,無法檢查 Flutter 中是否安裝了 StatelessWidget。這只能在 State/Stateful 小部件上實現。

但從Flutter 3.7開始,BuildContext 本身就有一個 mounted 屬性。

這使得檢查是否安裝了任何小部件變得很容易,并且您可以從任何地方檢查它,無論它來自 StatefulWidget State 還是來自 Stateless widget,就像這樣:

// inside any widget
@override
Widget build(BuildContext context) {
  return ElevatedButton(
    child: const Text('Submit'),
    onPressed: () async {
      await doSomeAsyncWork(); // a method that returns a Future
      if (context.mounted) {
        Navigator.of(context).pop();
      }
    },
  );
}

我在 StackOverflow 上看到很多關于無論如何都要在任何地方使用 mounted 屬性的必要性的問題。請記住,使用 mounted 屬性不是強制性的,但這是一個很好的做法。在特殊情況下使用的良好實踐。

原文:https://medium.com/@wartelski/everything-you-need-to-know-about-the-mounted-property-in-flutter-b603fdb51cb4

責任編輯:武曉燕 來源: 獨立開發者張張
相關推薦

2021-08-09 14:40:02

物聯網IOT智能家居

2023-03-29 21:05:03

布線結構化布線

2022-03-14 16:50:54

物聯網IoT云計算

2024-04-10 11:47:34

2023-12-29 09:50:51

智能機器人人工智能

2023-06-25 10:14:46

智能機器人人工智能

2020-05-12 16:10:34

Wi-Fi網狀網絡網絡

2023-05-28 18:21:32

2023-08-11 08:00:00

人工智能Keras 3.0

2023-12-06 14:07:56

數字孿生AI

2021-12-29 14:24:12

物聯網IoT5G

2021-08-06 06:51:15

TypeScript Any 類型

2018-07-18 09:00:00

區塊鏈職位工作崗位

2018-09-27 18:56:25

區塊鏈

2024-01-09 15:04:29

Cat6a電纜以太網

2018-04-19 09:00:00

PythonAnacondaCPython

2022-01-05 11:02:44

物聯網開發物聯網IOT

2022-12-01 10:08:43

預測性維護物聯網

2020-04-21 14:49:35

物聯網數據技術

2020-05-12 10:43:24

物聯網數據技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 好姑娘高清在线观看电影 | 久久久久国产视频 | 中文在线a在线 | 91av亚洲| 自拍偷拍中文字幕 | 欧美三级久久久 | 在线观看深夜视频 | 亚洲一区二区三区视频 | 午夜精品久久久 | 日韩欧美一区二区在线播放 | 在线免费看毛片 | 97视频在线观看网站 | 最新中文字幕在线 | 亚洲一区在线播放 | 亚洲a毛片| 亚洲高清视频在线 | av男人的天堂av | 欧美成人a∨高清免费观看 欧美日韩中 | 精品粉嫩超白一线天av | 日韩av一区二区在线 | 日本一区二区三区免费观看 | av免费网| a久久 | 中文在线a在线 | 一二三四在线视频观看社区 | 日日操视频 | 免费在线观看一区二区 | 看av网| 国产精品视频一二三区 | a在线观看| 福利精品在线观看 | 97国产一区二区精品久久呦 | 精品99在线| 免费在线观看成年人视频 | 99精品国产一区二区三区 | 九九热免费视频在线观看 | 日韩黄色小视频 | 亚洲午夜精品一区二区三区他趣 | 久久久一区二区三区四区 | 欧美激情在线一区二区三区 | 精品视频一区二区三区在线观看 |