🔍 Provider 架构概览
Provider 的核心是基于 Flutter 的 InheritedWidget,通过组合多种设计模式实现的状态管理解决方案。
dart
// Provider 的核心继承关系
InheritedWidget
↓
InheritedProvider
↓
Provider<T>
🏗️ 核心组件实现原理
1. Provider - 数据提供者
dart
class Provider<T> extends InheritedProvider<T> {
Provider({
Key? key,
required Create<T> create,
Widget? child,
}) : super(
key: key,
create: create,
dispose: _defaultDispose,
child: child,
);
static void _defaultDispose<T>(BuildContext context, T value) {
// 自动处理 ValueListenable 和 Stream 的关闭
if (value is ValueListenable) {
value.dispose();
} else if (value is StreamController) {
value.close();
}
}
}
关键实现点:
- 继承自
InheritedProvider,后者继承自InheritedWidget - 使用
Create<T>回调来懒创建值 - 自动资源管理,支持
dispose回调
2. InheritedWidget 的魔法
dart
abstract class InheritedProvider<T> extends InheritedWidget {
@override
bool updateShouldNotify(InheritedProvider<T> oldWidget) {
// 关键:决定何时通知依赖的 Widget 重建
return oldWidget._value != _value;
}
T get value {
// 通过 BuildContext 建立依赖关系
_dependencies?.add(_getElement());
return _value;
}
}
3. Consumer - 数据消费者
dart
class Consumer<T> extends StatelessWidget {
@override
Widget build(BuildContext context) {
return builder(
context,
Provider.of<T>(context), // 这里建立依赖关系
child,
);
}
}
🔄 状态更新机制
1. 依赖收集原理
dart
// Provider.of 的核心逻辑
static T of<T>(BuildContext context, {bool listen = true}) {
final provider = listen
? context.dependOnInheritedWidgetOfExactType<InheritedProvider<T>>()
: context.getInheritedWidgetOfExactType<InheritedProvider<T>>();
return provider!.value;
}
关键区别:
dependOnInheritedWidgetOfExactType:建立依赖,状态变化时重建getInheritedWidgetOfExactType:不建立依赖,状态变化时不重建
2. 通知更新流程
dart
class ChangeNotifierProvider<T extends ChangeNotifier> extends Provider<T> {
@override
void updateShouldNotify(ChangeNotifierProvider<T> old) {
return true; // 总是通知,因为 ChangeNotifier 自己控制更新
}
void _update() {
// 当 ChangeNotifier 调用 notifyListeners() 时触发
if (mounted) {
markNeedsBuild(); // 标记需要重建
}
}
}
🎯 多种 Provider 的实现差异
1. ChangeNotifierProvider
dart
class ChangeNotifierProvider<T extends ChangeNotifier>
extends ListenableProvider<T> {
@override
void _startListening() {
_value?.addListener(_update); // 监听 ChangeNotifier 的变化
}
@override
void _stopListening() {
_value?.removeListener(_update);
}
}
2. StreamProvider
dart
class StreamProvider<T> extends Provider<AsyncValue<T>> {
StreamSubscription<T>? _subscription;
@override
void _startListening() {
_subscription = stream.listen(
(T data) {
_value = AsyncValue<T>.data(data);
notifyListeners();
},
onError: (Object error, StackTrace stackTrace) {
_value = AsyncValue<T>.error(error, stackTrace);
notifyListeners();
},
);
}
}
3. FutureProvider
dart
class FutureProvider<T> extends Provider<AsyncValue<T>> {
@override
void initState() {
super.initState();
_future = create(context);
_future?.then((T data) {
_value = AsyncValue<T>.data(data);
notifyListeners();
}).catchError((Object error, StackTrace stackTrace) {
_value = AsyncValue<T>.error(error, stackTrace);
notifyListeners();
});
}
}
⚡ 性能优化机制
1. 选择性重建
dart
class Selector<A, S> extends Selector0<S> {
@override
bool shouldRebuild(S old, S current) {
// 只有选择器的返回值发生变化时才重建
return selector(oldContext, old) != selector(currentContext, current);
}
}
2. 值比较优化
dart
class Provider<T> extends InheritedProvider<T> {
@override
bool updateShouldNotify(Provider<T> old) {
// 使用 identical 比较,避免深度比较的性能开销
return !identical(old._value, _value);
}
}
🔧 生命周期管理
dart
abstract class _SingleProviderStateMixin<T> extends State<SingleProvider<T>> {
@override
void initState() {
super.initState();
_createValue(); // 初始化时创建值
}
@override
void dispose() {
_disposeValue(); // 销毁时清理资源
super.dispose();
}
@override
void didUpdateWidget(SingleProvider<T> oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.create != widget.create) {
_disposeValue();
_createValue();
}
}
}
🎨 依赖注入原理
1. 多层 Provider 嵌套
dart
MultiProvider(
providers: [
Provider<AuthService>(create: (_) => AuthService()),
ProxyProvider<AuthService, UserRepository>(
create: (context) => UserRepository(
authService: Provider.of<AuthService>(context),
),
),
],
child: MyApp(),
)
2. ProxyProvider 的实现
dart
class ProxyProvider<A, T> extends Provider<T>
implements Dependent<A> {
@override
void updateDependent(BuildContext context, A value) {
// 当依赖的 Provider 更新时,重新创建当前值
final previous = _value;
_value = create(context);
if (previous != _value) {
notifyListeners();
}
}
}
📊 Provider 的工作流程总结
- 初始化阶段:Provider 在 Widget 树中注册自己
- 依赖建立:Consumer/Provider.of 通过 context 建立依赖关系
- 状态读取 :通过
Provider.of(context)或context.watch()读取状态 - 状态更新 :调用
notifyListeners()或状态自然更新 - 重建通知:InheritedWidget 通知所有依赖的 Widget 重建
- 选择性重建:只有真正依赖变化数据的 Widget 才会重建
💡 设计模式应用
- 观察者模式 :
ChangeNotifier+notifyListeners() - 依赖注入:通过 Widget 树提供依赖
- 代理模式 :
ProxyProvider实现依赖链 - 工厂模式 :
Create<T>回调创建对象实例
这种精妙的设计使得 Provider 在保持简单 API 的同时,提供了强大的状态管理能力,并且具有优秀的性能表现。