provide是谷歌官方出品的一個狀態管理框架 flutter-provide,它容許在小部件樹中傳遞數據,它被設計爲ScopedModel的替代品,容許咱們更加靈活地處理數據類型和數據vue
在進行項目的開發時,咱們每每須要管理不一樣頁面之間的數據共享,在頁面功能複雜,狀態達到幾十個上百個的時候,咱們會難以清楚的維護咱們的數據狀態,本文將以主題切換這個功能使用狀態管理來說解如何在Flutter中使用provide這個狀態管理框架git
一開始項目使用的是ScopedModel,使用ScopedModel能夠分離展現邏輯和業務邏輯,並且簡單易用,可是ScopedModel有一些侷限github
使用Providevuex
flutter-ui, 可參考項目中使用provide方法markdown
查看 pub-install框架
dependencies:
provide: ^1.0.2 #數據管理層
複製代碼
flutter packages get
複製代碼
import 'package:provide/provide.dart'
複製代碼
新建 lib/store/models/config_state_model.dart 文件async
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通知聽衆刷新ide
新建 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小部件獲取狀態封裝
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);
}
}
複製代碼
須要管理多個狀態只須要ui
final providers = Providers() ..provide(Provider.value(ConfigModel())) ..provide(Provider.value(More()));
lib/main.dart 文件
import 'package:flutter/material.dart';
import 'package:efox_flutter/store/index.dart'
show Store, ConfigModel;
// 將狀態放入到頂層
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狀態
return Store.connect<ConfigModel>(
builder: (context, child, model) {
return MaterialApp(
theme: ThemeData(
primaryColor: Color(model.theme)
)
);
}
);
}
}
複製代碼
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: () {
// 修改主題狀態
Store.value<ConfigModel>(context).$setTheme(name)
}
child: Container(
color: Color(color),
height: 30,
widtg: 30
)
);
}
複製代碼
歡迎更多學習flutter的小夥伴加入QQ羣 Flutter UI: 798874340
敬請關注咱們正在開發的:efoxTeam/flutter-ui 做者github