Flutter UI如何使用Provide實(shí)現(xiàn)主題切換詳解
背景
provide是谷歌官方出品的一個(gè)狀態(tài)管理框架flutter-provide,它允許在小部件樹中傳遞數(shù)據(jù),它被設(shè)計(jì)為ScopedModel的替代品,允許我們更加靈活地處理數(shù)據(jù)類型和數(shù)據(jù)
為什么需要狀態(tài)管理
在進(jìn)行項(xiàng)目的開發(fā)時(shí),我們往往需要管理不同頁面之間的數(shù)據(jù)共享,在頁面功能復(fù)雜,狀態(tài)達(dá)到幾十個(gè)上百個(gè)的時(shí)候,我們會(huì)難以清楚的維護(hù)我們的數(shù)據(jù)狀態(tài),本文將以主題切換這個(gè)功能使用狀態(tài)管理來講解如何在Flutter中使用provide這個(gè)狀態(tài)管理框架
為什么選擇Provide
一開始項(xiàng)目使用的是ScopedModel,使用ScopedModel可以分離展示邏輯和業(yè)務(wù)邏輯,而且簡(jiǎn)單易用,但是ScopedModel有一些局限
如果模型較為復(fù)雜,當(dāng)狀態(tài)更新時(shí),會(huì)有較多的不必要的更新
使用Provide
- 當(dāng)狀態(tài)發(fā)生變化時(shí),widget樹會(huì)更新指定的節(jié)點(diǎn),不會(huì)進(jìn)行整顆widget樹的更新
- Provide有泛型的優(yōu)勢(shì),相當(dāng)于namespace的特性,使用過vuex的應(yīng)該知道namespace的重要性,它將我們的狀態(tài)分離開來
- Provide被設(shè)計(jì)為ScopedModel的替代品,同樣也有和ScopedModel的易用性
- Provide提供了Provide.stream可以以處理流的方式處理數(shù)據(jù),不過目前還存在一些問題
項(xiàng)目地址
flutter-ui, 可參考項(xiàng)目中使用provide方法
效果
如何使用
添加依賴
查看 pub-install
在pubspec.yaml中引入依賴
dependencies: provide: ^1.0.2 #數(shù)據(jù)管理層
執(zhí)行
flutter packages get
在需要使用的頁面中引入
import 'package:provide/provide.dart'
創(chuàng)建model (這才第一步)
新建 lib/store/models/config_state_model.dart 文件
import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart' show ChangeNotifier class ConfigInfo { String theme = 'red'; } class ConfigModel extends ConfigInfo with ChangeNotifier { Future $setTheme(payload) async { theme = payload; notifyListeners(); } }
用法同ScopedModel差不多,不過不需要繼承Model類,只需要混入ChangeNotifier,通過notifyListeners通知聽眾刷新
封裝Store (沒錯(cuò),到這里已經(jīng)要快完成所有步驟了)
新建 lib/store/index.dart 文件
import 'package:flutter/material.dart' import 'package:provide/provide.dart' show Providers Provider, Provide, ProviderNode; import './models/config_state_model.dart' show ConfigModel; class Store { // 我們將會(huì)在main.dart中runAPP實(shí)例化init static init({model, child, dispose = true}) { final providers = Providers() ..provide(Provider.value(ConfigModel())); return ProviderNode( child: child, providers: providers, dispose: dispose ); } // 通過Provide小部件獲取狀態(tài)封裝 static connect<T>({builder, child, scope}) { return Provide<T>( builder: builder, child: child, scope: scope ); } // 通過Provide.value<T>(context)獲取封裝 static T value<T>(context, {scope}) { return Provide.value<T>(context, scoped: scoped); } }
需要管理多個(gè)狀態(tài)只需要
final providers = Providers()
..provide(Provider.value(ConfigModel()))
..provide(Provider.value(More()));
定義全局的Provide (倒數(shù)第二)
lib/main.dart 文件
import 'package:flutter/material.dart'; import 'package:efox_flutter/store/index.dart' show Store, ConfigModel; // 將狀態(tài)放入到頂層 void main() => runApp(Store.init(child: MainApp())); class MainApp extends StatefulWidget { @override MainAppState createState() => MainAppState(); } class MainAppState extends State<MainApp> { @override Widget build(BuildContext context) { // 獲取Provide狀態(tài) return Store.connect<ConfigModel>( builder: (context, child, model) { return MaterialApp( theme: ThemeData( primaryColor: Color(model.theme) ) ); } ); } }
改變主題狀態(tài) (完成)
import 'package:flutter/material.dart'; import 'package:efox_flutter/store/index.dart' show ConfigModel, Store; /** * name: 顏色名稱 如 red * color:顏色值 * context: 上下文 */ Widget Edage(name, color, context) { return GestrueDetector( onTap: () { // 修改主題狀態(tài) Store.value<ConfigModel>(context).$setTheme(name) } child: Container( color: Color(color), height: 30, widtg: 30 ) ); }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android實(shí)現(xiàn)可復(fù)用的篩選頁面
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可復(fù)用的篩選頁面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路
本文通過實(shí)例代碼給大家講解了Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路及解決方案,需要的朋友參考下吧2017-05-05Android Studio如何查看源碼并調(diào)試的方法步驟
這篇文章主要介紹了Android Studio如何查看源碼并調(diào)試的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Android自定義控件實(shí)現(xiàn)通用驗(yàn)證碼輸入框(二)
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)通用驗(yàn)證碼輸入框的第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01僅5步搞定Android開發(fā)環(huán)境部署 Android開發(fā)環(huán)境搭建教程
僅5步搞定Android開發(fā)環(huán)境部署,這篇文章主要為大家詳細(xì)介紹了Android開發(fā)環(huán)境搭建教程,感興趣的小伙伴們可以參考一下2016-02-02android網(wǎng)絡(luò)圖片查看器簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了android網(wǎng)絡(luò)圖片查看器的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android OkHttp的簡(jiǎn)單使用和封裝詳解
這篇文章主要介紹了Android OkHttp的簡(jiǎn)單使用和封裝詳解的相關(guān)資料,Android OKHttp的簡(jiǎn)單get、post的使用,再到它的封裝,需要的朋友可以參考下2016-12-12