網站首頁 編程語言 正文
前言
全局變量似乎是很棒的 Flutter 程序組件,因為它們被聲明一次并且可以被程序中的每個函數訪問。 但是,這些變量的成本比你想象的要高,主要是因為:
- 如果刪除一個全局變量,則必須搜索整個程序并重構每個有權訪問已刪除全局變量的函數
- 它們很難測試,因為你必須在測試用例之間重置它們
- 很難跟蹤更改,因為每個函數都可以修改全局變量
以上所有原因都說明了為什么在 Flutter 中永遠不應該使用全局變量。 在本文中,我們將詳細了解全局變量的缺點,并學習如何以更有效的方式管理狀態。
Flutter 中的全局變量是什么?
全局變量是公共變量,可以被 Flutter 程序中的每個方法和對象訪問。
全局變量是局部變量的替代品,它們在方法中創建并在該方法中訪問。
局部變量和全局變量之間的區別在于,局部變量不能被同一程序中的其他方法訪問——因此,與全局變量相比,局部變量的作用域是有限的。
Flutter 中使用全局變量的缺點
在 Flutter 中使用全局變量一直受到質疑和批評,通常被認為是不好的做法。 以下是使用全局變量的缺點:
1. 復雜的代碼維護過程
更改或刪除一個全局變量會觸發一系列事件,因為使用全局變量的小部件和方法將受到影響。
如果要更改全局變量,則必須分析訪問全局變量的每個小部件將如何受到影響并進行特定且必要的更改。
如果刪除一個全局變量,則必須搜索整個程序并重構每個有權訪問已刪除全局變量的函數。
2. 全局變量使單元測試變得痛苦
如果你更改了一個具有全局變量的模塊,那么你將不得不為下一次測試重置它。
很難理解使用全局變量的遺留代碼,而理解程序流程是如何工作的更是難上加難。 很難有效地測試你不理解的代碼,調試也很困難,因為你不知道是誰改變了全局變量。
3. 全局變量導致“面條”代碼
由于程序中的每個函數都可以修改全局變量,因此很難跟蹤更改。 如果你正在構建一個大型應用程序,在 Flutter 中使用全局變量的情況會升級。 即使你正在構建小型 Flutter 應用程序,全局變量也會導致災難。
4. 全局變量無法封裝
全局變量使得無法實現封裝,這是一種將代碼包裝到單個單元中的 OOP 概念。 封裝使得代碼的維護變得安全和容易。?如果你想有效地使用封裝,你必須禁止全局變量。
由于全局變量創建了“面條”代碼,因此需要大量的規范來約束它們。 但是,有些開發人員會使用全局變量,因為他們在一個小團隊中,并且在某些情況下不利于更改。
但是,無論應用程序的大小如何,當需要維護代碼時,全局變量都會帶來挑戰。 如果有必要使用全局變量,至少使它們不可變。
在下一部分中,你將學習狀態管理庫和包,它們提供了以更好的方式管理變量狀態的更好方法,而不會影響維護過程。
如何以更好的方式管理狀態
Flutter 是一個跨平臺的動態框架,用于收集和處理來自用戶的數據。
從開關到單選按鈕,必須有效地管理數據狀態。 但是,全局變量會增加應用程序數據流的復雜性。 全局變量使數據很容易發生變異,這可能會導致處理從用戶那里收集的數據時出現混亂。
provider
?等狀態管理包可用于緩解全局變量帶來的問題。 以下是可用于管理狀態的狀態包管理器和庫的列表:
1. Provider 狀態管理包
Provider
?狀態管理器包被廣泛用于收集小部件狀態數據并在狀態更改時更新小部件。
使用提供程序時,只有受影響的小部件會在數據發生突變時被更新。 與隨處變化的全局變量相比,Provider
?降低了復雜性。?Provider
?從小部件收集數據并監聽小部件周圍發生的數據變化。
該包將應用程序狀態與 UI 分離,Provider
?促進應用程序維護和測試。
使用以下代碼片段添加和使用?Provider
?包插件:
dependencies: flutter: sdk: flutter provider: ^3.1.0
Provider
?程序包還允許你與多個類共享小部件狀態:
void main() { runApp( MultiProvider( providers: [ ChangeNotifierProvider(create: (context) => CartModel()), Provider(create: (context) => SomeOtherClass()), ], child: const MyApp(), ), ); }
2. GetX
GetX 是一個輕量級的 Flutter 庫,它提高了可擴展性,因為它允許你解耦視圖、依賴注入、表示層和依賴注入。
它提供以下功能:
- 狀態管理
- 依賴注入
- 導航
- 路由管理
如果你正在尋找一個節省資源且消耗最少的庫,GetX 是你的最佳選擇。
要在 Flutter 應用程序啟動中開始使用 GetX,請將 get 添加到你的?pubspec.yaml
?文件中:
dependencies: get:
接下來,導入使用 GetX 庫函數和組件時需要的 get 文件:
import 'package:get/get.dart';
3. Riverpod
Riverpod 類似于 `provider——唯一的區別是它以單向方式分發數據。
此狀態管理器確保你的代碼可測試且易于閱讀,因為它消除了用于組合對象的嵌套。 特殊功能是它在編譯過程中檢測錯誤。 這將節省你的時間,因為你將在運行時將缺陷添加到你的應用程序之前修復錯誤。
4. Redux
Redux 是一個庫,可幫助你有效地管理小部件的數據狀態。 Redux 是一種以單向方式跨小部件執行狀態數據分布的架構。 該庫很棒,因為它消除了狀態重復,你可以測試狀態結果是否為真。
5. SetState 方法
之前,我們只介紹了管理狀態的 Flutter 包和庫。
當你的小部件更改數據值時,可以調用一個名為?setState
?的方法。 它將導致 UI 根據新狀態發生變化。 你可以添加在狀態更改時執行某些操作的代碼。 下面是 Flutter 中 setState 的基本實現:
class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { _counter++; setState(() {}); }
總結
本文我們詳細了解了全局變量是什么以及為什么我們不應該在 Flutter 中使用它們。 此外,我們還探索了可用于更有效地管理狀態的各種狀態管理庫。
原文鏈接:https://juejin.cn/post/7135215899052605447
相關推薦
- 2023-03-28 python方法如何實現字符串反轉_python
- 2022-10-07 詳解python數值與字符串高級用法_python
- 2022-07-09 Python如何將數字變成帶逗號的千分位_python
- 2023-03-23 Python中win32com模塊的使用_python
- 2022-06-18 python使用Random隨機生成列表的方法實例_python
- 2022-03-30 Android實現靜音檢測功能_Android
- 2022-12-13 python字典如何獲取最大和最小value對應的key_python
- 2023-01-19 詳解Go語言實現線性查找算法和二分查找算法_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支