Flutter各大主流狀態管理框架技術選型分析及具體使用步驟


技術選型決策樹

小型應用
中大型應用
嚴格狀態追溯
響應式編程
簡單局部狀態
新手
React背景
Vue背景
高頻更新
低內存占用
項目需求
GetX
Riverpod
Bloc
MobX
ValueNotifier
團隊經驗
性能要求
Redux

示例對比表

框架學習曲線樣板代碼類型安全測試友好適用規模
Provider小-中
Riverpod所有規模
Bloc中-大
GetX極少
MobX中-大
ValueNotifier極少局部狀態

1. Provider(官方基礎方案)

使用步驟:
創建ChangeNotifier模型
用Provider包裹應用
在UI中使用context.watch

詳細步驟

  1. 添加依賴
dependencies:flutter:sdk: flutterprovider: ^6.0.5
  1. 創建狀態模型
class CounterModel with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners(); // 通知監聽器}
}
  1. 在頂層包裹Provider
void main() {runApp(ChangeNotifierProvider(create: (context) => CounterModel(),child: MyApp(),),);
}
  1. 在UI中使用狀態
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {final counter = context.watch<CounterModel>();return Scaffold(body: Text('Count: ${counter.count}'),floatingActionButton: FloatingActionButton(onPressed: () => counter.increment(),child: Icon(Icons.add),),);}
}

2. Riverpod(現代推薦方案)

使用步驟:
定義Provider
用ProviderScope包裹
使用WidgetRef訪問

詳細步驟

  1. 添加依賴
dependencies:flutter_riverpod: ^2.4.9riverpod_annotation: ^2.3.0
dev_dependencies:build_runner: ^2.4.8riverpod_generator: ^2.3.3
  1. 創建Provider
// counter_provider.dart
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'counter_provider.g.dart';
class Counter extends _$Counter {int build() => 0; // 初始狀態void increment() => state++;
}
  1. 生成代碼
flutter pub run build_runner watch
  1. 設置ProviderScope
void main() {runApp(ProviderScope(child: MyApp(),),);
}
  1. 在UI中使用
class CounterScreen extends ConsumerWidget {Widget build(BuildContext context, WidgetRef ref) {final count = ref.watch(counterProvider);return Scaffold(body: Text('Count: $count'),floatingActionButton: FloatingActionButton(onPressed: () => ref.read(counterProvider.notifier).increment(),child: Icon(Icons.add),);}
}

3. Bloc(企業級方案)

使用步驟:
定義Event
定義State
創建Bloc處理邏輯
用BlocBuilder連接

詳細步驟

  1. 添加依賴
dependencies:flutter_bloc: ^8.1.3bloc: ^8.1.0
  1. 定義事件和狀態
// 事件
abstract class CounterEvent {}
class Increment extends CounterEvent {}// 狀態
class CounterState {final int count;CounterState(this.count);
}
  1. 創建Bloc
class CounterBloc extends Bloc<CounterEvent, CounterState> {CounterBloc() : super(CounterState(0)) {on<Increment>((event, emit) {emit(CounterState(state.count + 1));});}
}
  1. 在頂層提供Bloc
void main() {runApp(BlocProvider(create: (context) => CounterBloc(),child: MyApp(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: BlocBuilder<CounterBloc, CounterState>(builder: (context, state) {return Text('Count: ${state.count}');},),floatingActionButton: FloatingActionButton(onPressed: () => context.read<CounterBloc>().add(Increment()),child: Icon(Icons.add),),);}
}

4. GetX(全棧式方案)

使用步驟:
創建Controller
用Obx包裹UI
更新響應式變量

詳細步驟

  1. 添加依賴
dependencies:get: ^4.6.5
  1. 創建控制器
class CounterController extends GetxController {var count = 0.obs; // 響應式變量void increment() => count++;
}
  1. 配置GetMaterialApp
void main() {runApp(GetMaterialApp( // 替換MaterialApphome: CounterScreen(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {final CounterController c = Get.put(CounterController());Widget build(BuildContext context) {return Scaffold(body: Obx(() => Text('Count: ${c.count}')),floatingActionButton: FloatingActionButton(onPressed: () => c.increment(),child: Icon(Icons.add),),);}
}
  1. 路由導航(無需context)
// 任何地方調用
Get.to(NextScreen());
Get.back();

5. Redux(單向數據流方案)

使用步驟:
定義State
定義Actions
創建Reducer
創建Store
用StoreProvider包裹

詳細步驟

  1. 添加依賴
dependencies:flutter_redux: ^0.11.0redux: ^5.0.0
  1. 定義狀態和操作
// 狀態
class AppState {final int counter;AppState(this.counter);
}// 操作
class IncrementAction {}
  1. 創建Reducer
AppState reducer(AppState state, dynamic action) {if (action is IncrementAction) {return AppState(state.counter + 1);}return state;
}
  1. 創建Store
void main() {final store = Store<AppState>(reducer,initialState: AppState(0),);runApp(StoreProvider(store: store,child: MyApp(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {return StoreConnector<AppState, int>(converter: (store) => store.state.counter,builder: (context, count) {return Scaffold(body: Text('Count: $count'),floatingActionButton: FloatingActionButton(onPressed: () => StoreProvider.of<AppState>(context).dispatch(IncrementAction()),child: Icon(Icons.add),),);},);}
}

6. MobX(響應式方案)

使用步驟:
graph TDC[創建Store] --> O[用Observer包裹UI]O --> R[更新@observable變量]

詳細步驟

  1. 添加依賴
dependencies:flutter_mobx: ^2.0.6mobx: ^2.1.3build_runner: ^2.4.8
dev_dependencies:mobx_codegen: ^2.0.7
  1. 創建Store
import 'package:mobx/mobx.dart';part 'counter_store.g.dart';class CounterStore = _CounterStore with _$CounterStore;abstract class _CounterStore with Store {int count = 0;void increment() {count++;}
}
  1. 生成代碼
flutter pub run build_runner build
  1. 在頂層提供Store
void main() {final counterStore = CounterStore();runApp(Provider(create: (context) => counterStore,child: MyApp(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {final counterStore = Provider.of<CounterStore>(context);return Scaffold(body: Observer(builder: (_) => Text('Count: ${counterStore.count}'),),floatingActionButton: FloatingActionButton(onPressed: () => counterStore.increment(),child: Icon(Icons.add),),);}
}

7. ValueNotifier(輕量級方案)

使用步驟:
創建ValueNotifier
用ValueListenableBuilder包裹
更新value屬性

詳細步驟

  1. 創建ValueNotifier
final counterNotifier = ValueNotifier<int>(0);
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: ValueListenableBuilder<int>(valueListenable: counterNotifier,builder: (context, value, _) {return Text('Count: $value');},),floatingActionButton: FloatingActionButton(onPressed: () => counterNotifier.value++,child: Icon(Icons.add),),);}
}
  1. 清理資源(在StatefulWidget中)

void dispose() {counterNotifier.dispose();super.dispose();
}

金句建議
“狀態管理是Flutter開發的靈魂抉擇,Riverpod和Bloc代表著工程化的未來,
而GetX則是快速驗證創意的利器——明智的選擇比盲目的努力更重要”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91933.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis類型之String

1.Redis中的string注意本文以及之后講的redis的類型但是指的value的類型&#xff0c;所有的key都是stringRedis中的字符串&#xff0c;直接就是按照二進制數據的方式存儲的&#xff0c;不會做任何的編碼轉換&#xff0c;這里相對于mysql就比較好&#xff08;個人感覺&#xff0…

[激光原理與應用-156]:光學器件 - 激光器為什么會出現多余的能量,哪些地方會出現多余能量?

在激光器運行過程中&#xff0c;多余能量的出現是不可避免的物理現象&#xff0c;其根源在于能量轉換與傳輸過程中的非理想特性。以下從能量來源、產生位置及具體機制三方面進行詳細說明&#xff1a;一、多余能量的主要來源泵浦源效率限制泵浦源&#xff08;如激光二極管、閃光…

Arxiv-Daily

Daily Paper Report - 2025-07-24 12:53 Today’s Recommended Papers 1. Multi-modal Multi-task Pre-training for Improved Point Cloud Understanding Authors: Liwen Liu, Weidong Yang, Lipeng Ma, Ben Fei Deep-Dive Summary: 多模態多任務預訓練以改善點云理解 預…

如何對云環境或者超融合系統進行性能測試?

最近幾個月&#xff0c;公司開啟了新的產品計劃&#xff0c;準備來做一個國產超融合一體機&#xff08;其實個人覺得現在入行已經晚了太多了&#xff0c;市場基本沒有多少了&#xff09; POC功能測試過完&#xff0c;但是感覺不到什么優勢&#xff0c;由于芯片架構采用的是arm架…

【web自動化測試】實戰

web自動化測試就是對界面的測試1、編寫測試用例2、參考測試用例&#xff0c;創建自動化測試項目&#xff0c;編寫自動化測試腳本論壇登錄頁&#xff1a;ForumLoginTest.py論壇首頁&#xff1a;ForumListTest.py論壇詳情頁&#xff1a;ForumDetailTest.py論壇編輯頁&#xff1a;…

在Maxscript中隨機化對象變換、顏色和材質

只需幾行Maxscript,即可為3ds Max場景帶來更多活力和變化! 在本文中,您將學習如何快速隨機化選定對象的位置、旋轉、線顏色和材質。 非常適合在ArchViz、動態圖形和產品可視化項目中創建更自然、更少機械的布局。 為什么要使用隨機化腳本? 1.快速為場景添加自然隨機性 2.…

分類數據集 - 交通事故場景分類數據集下載

數據集介紹&#xff1a;交通事故場景分類數據集&#xff0c;真實交通場景高質量圖片數據&#xff1b;適用實際項目應用&#xff1a;公共場所監控場景下是否發生交通事故檢測項目&#xff0c;以及作為監控場景通用交通檢測數據集場景數據的補充&#xff1b;數據集類別&#xff1…

內網公網詳解,及無公網IP內網穿透給外網直接遠程連接訪問的具體實現方法步驟

一、什么是內網、外網1、內網IP&#xff08;局域網IP&#xff09;是指在私有網絡或局域網內部使用的IP地址&#xff0c;無法直接從互聯網訪問&#xff0c;需通過NAT&#xff08;網絡地址轉換&#xff09;技術實現對外通信。內網IP&#xff08;Intranet IP&#xff09;是專為局域…

Redis協議數據遷移方式

主從復制&#xff08;REPLICAOF/SLAVEOF&#xff09;&#xff1a;目標實例掛為從節點&#xff0c;通過復制協議全量增量同步后切換為主。模擬從節點工具&#xff1a;模擬復制協議同步數據&#xff0c;常見兩種實現&#xff1a;(1) 拉取全量和增量命令流&#xff0c;在本地生成 …

英語中日期與時間縮寫

日常使用中&#xff0c;時間縮寫無處不在。掌握這些縮寫不僅能提高溝通效率&#xff0c;還能讓您的英語表達更加地道和專業。本文將系統性地介紹英語中各類時間相關縮寫&#xff0c;包括月份、星期、時刻表達等&#xff0c;并提供實用記憶技巧和應用場景。 一、時間縮寫基礎概…

【Spring Cloud】-- RestTeplate實現遠程調用

實現遠程調用有很多種方式&#xff0c;這里我們使用RestTemplate來進行實現。 REST &#xff1a;表現層資源狀態轉移&#xff08;資源在網絡中以某種表現形式進行狀態轉移&#xff09;&#xff0c;是一種軟件架構風格&#xff0c;狀態轉移&#xff1a;數據狀態的變化。 表現層&…

2025年信創政策解讀:如何應對國產化替代挑戰?(附禪道/飛書多維表格/華為云DevCloud實戰指南)

本文核心產品&#xff1a;??禪道&#xff08;國產項目管理工具&#xff09;、飛書多維表格&#xff08;協同辦公工具&#xff09;、華為云DevCloud&#xff08;云端研發平臺&#xff09;?? ——在“自主可控”成為國家戰略關鍵詞的2025年&#xff0c;國產化替代已從“可選動…

如何讓 RAG 檢索更高效?——大模型召回策略全解

如何讓 RAG 檢索更高效&#xff1f;——大模型召回策略全解 一、引子&#xff1a;RAG 的“強”靠得住嗎&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;作為一種將文檔檢索與大語言模型結合的框架&#xff0c;已成為企業落地知識問答、搜索增強、智能…

Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代碼來源 https://github.com/ZhengPeng7/BiRefNet 模塊作用 DIS 是一種旨在對高分辨率圖像中的目標物體進行精確分割的技術&#xff0c;尤其適用于具有復雜細微結構的物體&#xff0c;例如細長的邊緣或微小細節。傳統方法在處理這類任務時往往難以捕捉細微特征或恢復高分辨…

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research&#xff1a;Agent 時代的核心能力2025 年被稱為 Agent 落地元年&#xff0c;在解鎖的各類場景中&#xff0c;最有代表性之一&#xff0c;就是 Deep Research 或者以它為基座的各類應用。為什么這么講&#xff1f; 因為通過 Agentic RAG 及其配套的反思機制&#…

CMakeLists.txt學習

一&#xff1a;#是行注釋 &#xff0c;[[ 塊注釋 ]]0.cmake_minimum_required: 指定使用的cmake的最低版本1.project() 定義工程名稱并可以指定工程的版本&#xff0c;工程描述&#xff0c;web主頁地址&#xff0c;支持的語言&#xff08;默認情況支持所有語言&#xff09;2.…

Pytorch-04 搭建神經網絡架構工作流

搭建神經網絡架構 在pytorch中&#xff0c;神經網絡被抽象成由一系列對數據執行特定操作的層或者模塊組成&#xff0c;比如下面的Attention實現&#xff0c;每個塊都是一個模塊或者層。 如果你想快速搭建網絡架構&#xff0c;torch.nn這個命名空間提供了所有很多開箱即用的層…

從“碎片化”到“完美重組”:IP報文的分片藝術

前言 在網絡通信中&#xff0c;當IP層需要傳輸的數據包大小超過數據鏈路層的MTU限制時&#xff0c;就必須進行分片處理。本文將完整解析IP分片的工作機制&#xff0c;包括分片字段的作用、如何減少分片&#xff0c;以及分片報文的組裝原理。 IP報頭解析請參考&#xff…

[GESP202306 四級] 2023年6月GESP C++四級上機題超詳細題解,附帶講解視頻!

本文為2023年6月GESP C四級的上機題目的詳細題解&#xff01;覺得寫的不錯或者有幫助可以點個贊啦! &#xff08;第一次講解視頻&#xff0c;有問題可以指出&#xff0c;不足之處也可以指出&#xff09; 目錄 題目一講解視頻: 題目二講解視頻: 題目一: 幸運數 題目大意: …

內網穿透 FRP 配置指南

關鍵詞&#xff1a;內網穿透、FRP配置、frps、frpc、遠程訪問、自建服務器、反向代理、TCP轉發、HTTP轉發 在開發或部署項目時&#xff0c;我們經常遇到內網設備無法被公網訪問的問題&#xff0c;例如你想從外網訪問你家里的 NAS、遠程調試開發板&#xff0c;或是訪問本地測試環…