一直觉得Getx比较笨重,也想多研究一些状态库,于是看到pub上一个小众的状态管理库,使用和Getx大同小异,更主要是源码比较少主要也就一百多行。
尝试研究解析一下。(README.md主页介绍很实在很亲切,好感倍增)
据说这个库的API跟riverpod很接近,但是更加简洁清晰,之后再研究下riverpod
使用很简单:
@override
Widget build(BuildContext context) {
return CreatorGraph(child:MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Counter example')),
body: Center(
// Watcher will rebuild whenever counter changes.
child: Watcher((context, ref, _) {
return Text('${ref.watch(counter)}');
}),
),
floatingActionButton: FloatingActionButton(
// Update state is easy.
onPressed: () =>
context.ref.update<int>(counter, (count) => count + 1),
child: const Icon(Icons.add),
),
),
));
}
推荐看下他所列的几个例子,可以直接在dartpad上运行很方便,功能还是挺强大的。
Weather
News
Graph
尝试看下源码creator
//首先主要是两个状态
enum AsyncDataStatus
class AsyncData<T> (this.status, this.data);
//create的base类 并且创造自己的基友ElementBase
abstract class CreatorBase<T> {this.name, this.keepAlive = false, this.args}
//持有状态,主要是getState和recreate 方法,生命周期也很简单:
//- It is added to the graph when firstly being watched.
//- It can be removed from the graph manually by [**Ref.dispose**].
//- If it has watchers, it is automatically removed from the graph when losing all its watchers, unless keepAlive property is set.
abstract class ElementBase<T> (this.ref, this.creator, this.state)
class Creator<T> extends CreatorBase<T> (this.create, {String? name, bool keepAlive = false, List<Object?>? args})
class CreatorElement<T> extends ElementBase<T> (ref, Creator<T> creator)
class Emitter<T> extends CreatorBase<Future<T>> (this.create, {String? name, bool keepAlive = false, List<Object?>? args})
class EmitterElement<T> extends ElementBase<Future<T>> (ref, Emitter<T> creator, this.completer)
又是两对好基友, 对Creator来说:它能够在第一次被监视时返回一个有效的state。关注recreate方法
对Emitter来说:在第一次被监视时,返回空Future,之后的调用和通知会返回Future.value。同样是recreate方法
class Change<T> (this.before, this.after)
extension CreatorChange<T> on Creator<T>
extension EmitterChange<T> on Emitter<T>
change包含前后两个状态,三个扩展是Creator和Emitter的change方法,都是记录状态的变化。
class Ref ({
CreatorBase? owner,
CreatorObserver? observer,
Map<CreatorBase, ElementBase>? elements,
Graph<CreatorBase>? graph,
Map<CreatorBase, Set<CreatorBase>>? before,
Map<CreatorBase, Set<CreatorBase>>? after,
Set<CreatorBase>? toCreate,
final Map<CreatorBase, void Function()>? onClean,
})
extension ContextRef on BuildContext
主要的有向图类,包含持有者,观察者及两个状态和依赖。 重点关注read、watch、set、update方法,以及内部的_onCreateStart _onCreateFinish _onStateChange _notifyWatcher方法
class CreatorObserver
class DefaultCreatorObserver extends CreatorObserver
观察者类监听creator状态变化,以及它的默认值
class Graph<T> ({this.name, this.keepAlive})
有向图类,它可以自动删除变为零的节点
class CreatorGraph extends StatefulWidget ({CreatorObserver observer = const DefaultCreatorObserver(),required this.child,})
class _CreatorGraph extends State<CreatorGraph>
class CreatorGraphData extends InheritedWidget ({required this.ref,required Widget child})
要用CreatorGraph包裹APP,以DefaultCreatorObserver记录状态变化
class Watcher extends StatefulWidget (this.builder,
{Key? key,
this.listener,
this.builderName,
this.listenerName,
this.child})
class _WatcherState extends State<Watcher>
使用Watcher包裹控件小部件
extension CreatorExtension<T> on Creator<T>
extension EmitterExtension<T> on Emitter<T>
扩展好基友的使用,筛选和遍历方法
概念简单,易于学习,从开源源码做起