Flutter狀態(tài)管理Provider示例解析
什么是狀態(tài)管理
狀態(tài)管理是一個(gè)十分廣泛的概念,因?yàn)闋顟B(tài)無處不在。從廣義角度講狀態(tài)管理就是頁面跟代碼、跟服務(wù)器進(jìn)行數(shù)據(jù)同步。例如:你在某購物應(yīng)用內(nèi),添加了一件商品,你需要在購物車頁面進(jìn)行展示。這就是一種狀態(tài)。相反的,你在商品頁面點(diǎn)擊了添加到購物車,卻在購物車頁面沒有發(fā)現(xiàn)或者過段時(shí)間它才展示了,這就是狀態(tài)管理沒有做好。這就是我所理解的狀態(tài)管理。
官方給出的解釋:狀態(tài)管理就是當(dāng)某個(gè)狀態(tài)發(fā)生改變的時(shí)候,告知使用該狀態(tài)的狀態(tài)監(jiān)聽者,讓狀態(tài)所監(jiān)聽的屬性隨之改變,從而達(dá)到聯(lián)動(dòng)效果。
常見的狀態(tài)管理框架有哪些
Provider
Provider是官方文檔的例子用的方法,Google 比較推薦的用法,也是今天的主角。Provider的實(shí)現(xiàn)在內(nèi)部還是利用了InheritedWidget,它就是用于提供數(shù)據(jù),可以很方便的管理狀態(tài)。
Redux
Redux是一種單向數(shù)據(jù)流架構(gòu),可以輕松開發(fā),維護(hù)和測(cè)試應(yīng)用程序,也是google推薦的狀態(tài)管理方式。所有的狀態(tài)都存儲(chǔ)在Store里,View拿到Store的狀態(tài)數(shù)據(jù)會(huì)映射成視圖渲染。Redux不直接讓view操作數(shù)據(jù),通過dispatch一個(gè)action通知Reducer,狀態(tài)變更(類似于vue中的vuex)。
GetX
GetX包含很多功能,各種彈出widget、路由管理、國際化、Utils、狀態(tài)管理等所以我覺得它不單單是一個(gè)狀態(tài)管理器,更像是一個(gè)框架(類似于vue cli)。關(guān)于GetX的爭(zhēng)論也很多,今天我們不討論。我的建議是,對(duì)于像我一樣的小白,還是從Provider開始,打好基礎(chǔ)再說。
Provider 使用
添加依賴
- 使用命令行方式
flutter pub add provider
- pubspec.yaml 添加這樣一行(并運(yùn)行隱式flutter pub get):
dependencies: provider: ^6.0.4
導(dǎo)入應(yīng)用
import 'package:provider/provider.dart';
定義需要共享的數(shù)據(jù)
class ProviderData with ChangeNotifier { int count = 0; void increment() { count++; notifyListeners(); } }
在應(yīng)用程序入口初始化
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import './provider/index.dart'; import './page/HomePage.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (_) => CountNotifier(), child: MaterialApp( debugShowCheckedModeBanner: false, home: const Scaffold( body: HomePage(), ), ), ); } }
使用共享數(shù)據(jù)
import 'package:flutter/material.dart'; import 'package:flutter_provider_example/provider_count_example/count_notifier.dart'; import './provider/provider.dart'; class ProviderExample extends StatefulWidget { const ProviderExample({Key? key}) : super(key: key); @override State<ProviderExample> createState() => _ProviderExampleState(); } class _ProviderExampleState extends State<ProviderExample> { final counter = Provider.of<ProviderData>(context); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("InheritedWidget"), ), floatingActionButton: FloatingActionButton( onPressed: (){ counter.increment(); }, child: const Icon(Icons.add), ), body: Center( child: Text(counter.count.toString(), style: const TextStyle( color: Colors.red, fontSize: 50 ), ), ), ); } }
狀態(tài)管理的好處
- 能有效分離 UI 層和數(shù)據(jù)處理層
- 幫助前端應(yīng)用結(jié)構(gòu)化數(shù)據(jù)
- 有效控制狀態(tài)的變化
- 處理同步與異步
- 實(shí)現(xiàn)一些日志打印,熱加,同構(gòu)應(yīng)用等功能
- ...
結(jié)束語
關(guān)于flutter狀態(tài)管理的學(xué)習(xí)到這里就結(jié)束了,更多關(guān)于Flutter狀態(tài)管理Provider的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)
這篇文章主要介紹了Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)效果,仿約會(huì)吧應(yīng)用詳情頁實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-05-05Android TextView(圓弧)邊框和背景實(shí)例詳解
這篇文章主要介紹了 Android TextView(圓?。┻吙蚝捅尘皩?shí)例詳解的相關(guān)資料,這里提供了實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖,需要的朋友可以參考下2016-11-11自定義Toast工具類ToastUtil防止多次點(diǎn)擊時(shí)Toast不消失的方法
下面小編就為大家?guī)硪黄远xToast工具類ToastUtil防止多次點(diǎn)擊時(shí)Toast不消失的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Android ListView 條目多樣式展示實(shí)例詳解
這篇文章主要介紹了Android ListView 條目多樣式展示的相關(guān)資料,需要的朋友可以參考下2017-04-04Android開發(fā)EditText實(shí)現(xiàn)密碼顯示隱藏
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)EditText實(shí)現(xiàn)密碼顯示隱藏,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android Framework Application Framework層簡(jiǎn)單介紹
這篇文章主要介紹了 Android Framework Application Framework層簡(jiǎn)單介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11android開發(fā)教程之自定義控件checkbox的樣式示例
這篇文章主要介紹了android自定義checkbox的樣式示例,需要的朋友可以參考下2014-03-03