开这篇文章是因为看到这个库被托管在google的仓库下,而且说明是被设计出来替代ScopedModel
的,而且更加灵活
支持Builder模式和StreamBuilder模式,全局,局部都可以
内部应该是结合InheritedWidget
Notification
体系实现的
传统的bloc需要在每一个Repository
中创建StreamController
和Stream
,甚至有的文章中,一个监听的修改需要修改5处,维护起来比较麻烦
相比较而言Provide
维护起来会稍微省事一些
添加依赖
dependencies:
provide: ^1.0.1 # 这里的版本查看官方
flutter packages get
import 'package:provide/provide.dart';
使用方法
这里以简单的Counter为例
也就是在flutter的hello world工程的基础上来修改
1. 定义一个Model
这个model需要继承ChangeNotifier
class Counter with ChangeNotifier {
int _value;
int get value => _value;
Counter(this._value);
void inc() {
_value++;
notifyListeners(); //父类的方法,发出通知
}
}
2. 定义一个全局的Provide
这里虽然定义在全局,但事实上也可以定义在页面级
void main() {
var providers = Providers()..provide(Provider.function((ctx) => Counter(0)));
runApp(
ProviderNode(
child: MyApp(),
providers: providers,
),
);
}
ProviderNode
表示的是提供者
3. 界面/监听
修改_MyHomePageState
添加一个方法,用于获取Counter实例
Counter get _counter => Provide.value<Counter>(context);
将原来的Text(_counter)修改一下
这里的Provide会在Counter发生变化的时候,触发builder回调来更新界面
Provide<Counter>(
builder: (BuildContext context, Widget child, Co