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