Flutter UI如何使用Provide實現(xiàn)主題切換詳解
背景
provide是谷歌官方出品的一個狀態(tài)管理框架flutter-provide,它允許在小部件樹中傳遞數(shù)據(jù),它被設計為ScopedModel的替代品,允許我們更加靈活地處理數(shù)據(jù)類型和數(shù)據(jù)
為什么需要狀態(tài)管理
在進行項目的開發(fā)時,我們往往需要管理不同頁面之間的數(shù)據(jù)共享,在頁面功能復雜,狀態(tài)達到幾十個上百個的時候,我們會難以清楚的維護我們的數(shù)據(jù)狀態(tài),本文將以主題切換這個功能使用狀態(tài)管理來講解如何在Flutter中使用provide這個狀態(tài)管理框架
為什么選擇Provide
一開始項目使用的是ScopedModel,使用ScopedModel可以分離展示邏輯和業(yè)務邏輯,而且簡單易用,但是ScopedModel有一些局限
如果模型較為復雜,當狀態(tài)更新時,會有較多的不必要的更新
使用Provide
- 當狀態(tài)發(fā)生變化時,widget樹會更新指定的節(jié)點,不會進行整顆widget樹的更新
- Provide有泛型的優(yōu)勢,相當于namespace的特性,使用過vuex的應該知道namespace的重要性,它將我們的狀態(tài)分離開來
- Provide被設計為ScopedModel的替代品,同樣也有和ScopedModel的易用性
- Provide提供了Provide.stream可以以處理流的方式處理數(shù)據(jù),不過目前還存在一些問題
項目地址
flutter-ui, 可參考項目中使用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 (沒錯,到這里已經(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 {
// 我們將會在main.dart中runAPP實例化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);
}
}
需要管理多個狀態(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
)
);
}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
基于Android實現(xiàn)可滾動的環(huán)形菜單效果
這篇文章主要為大家詳細介紹了Android如何使用kotlin實現(xiàn)可滾動的環(huán)形菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Android studio導出APP測試包和構建正式簽名包
大家好,本篇文章主要講的是Android studio導出APP測試包和構建正式簽名包,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2021-12-12
Android動態(tài)權限申請實現(xiàn)步驟分解
對于一些危險權限在AndroidManifest清單文件中申請之后,還需要得到用戶的許可并打開,才算是真正的開啟了這個權限。所以可以使用動態(tài)申請權限,對于某個功能,如果需要開啟某個權限,在用戶使用它之前,彈窗提示用戶是否要開啟這個權限2023-04-04
Android下錄制App操作生成Gif動態(tài)圖的全過程
這篇文章主要為大家分享了Android下錄制App操作生成Gif動態(tài)圖的全過程,感興趣的小伙伴們可以參考一下2016-01-01
Flutter?Widget開發(fā)之Focus組件圖文詳解
這篇文章主要為大家介紹了Flutter?Widget開發(fā)之Focus組件圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

