前言
使用一种语言编写各种应用的时候,横亘在开发者面前的第一个问题就是如何进行状态管理。在前端领域,我们习惯使用框架或者各种辅助库来进行状态管理。例如,开发者经常使用react自带的context,或者mobx/redux等工具来管理组件间状态。在大热的跨端框架flutter中,笔者将对社区中使用广泛的provider框架进行介绍。
准备工作
安装与引入
provider pub链接
官方文档宣称(本文基于4.0版本),provider是一个依赖注入和状态管理的混合工具,通过组件来构建组件。
provider有以下三个特点:
- 可维护性,provider强制使用单向数据流
- 易测性/可组合性,provider可以很方便地模拟或者复写数据
- 鲁棒性,provider会在合适的时候更新组件或者模型的状态,降低错误率
在pubspec.yaml文件中加入如下内容:
dependencies:
provider: ^4.0.0
然后执行命令flutter pub get
,安装到本地。
使用时只需在文件头部加上如下内容:
import 'package:provider/provider.dart';
暴露一个值
如果我们想让某个变量能够被一个widget及其子widget所引用,我们需要将其暴露出来,典型写法如下:
Provider(
create: (_) => new MyModel(),
child: ...
)
读取一个值
如果要使用先前暴露的对象,可以这样操作
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
MyModel yourValue = Provider.of<MyModel>(context)
return ...
}
}
暴露和使用多个值(MultiProvider)
Provider的构造方法可以嵌套使用
Provider<Something>(
create: (_) => Something(),
child: Provider<SomethingElse>(
create: (_) => SomethingElse(),
child: Provider<AnotherThing>(
create: (_) => AnotherThing(),
child: someWidget,
),
),
),
上述代码看起来过于繁琐,走入了嵌套地狱,好在provider给了更加优雅的实现
MultiProvider(
providers: [
Provider<Something>(create: (_) => Something()),
Provider<