关于 provider
面向 Flutter 开发者的 `provider` 使用指南,涵盖状态提供、读取、依赖管理与调试,并说明常见生命周期注意事项。
主要功能
- 01Provider 类型选择
- 02状态监听与读取
- 03依赖对象更新管理
- 04细粒度重建
- 05调试与迁移建议
适用场景
- 01为 Flutter 应用选择状态提供方式
- 02按需读取或监听组件状态
- 03处理依赖其他 Provider 的对象
- 04排查状态对象的调试显示
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ evanca/ flutter-ai-rules --skill provider安装后在 Claude Code 中输入/provider确认已加载。
详细介绍
Provider 技能
此技能定义了如何在 Flutter 应用中正确使用 provider 包。
1. Provider 类型
| Provider | 用途 |
|---|---|
Provider | 提供任意不可变值 |
ChangeNotifierProvider | 使用 ChangeNotifier 管理可变状态 |
FutureProvider | 提供 Future 结果 |
StreamProvider | 提供 Stream |
ProxyProvider / ChangeNotifierProxyProvider | 依赖其他 Provider 的对象 |
2. 设置
MultiProvider(
providers: [
Provider<Something>(create: (_) => Something()),
ChangeNotifierProvider(create: (_) => MyNotifier()),
FutureProvider<String>(create: (_) => fetchData(), initialData: ''),
],
child: MyApp(),
)
- 使用
MultiProvider将多个 Provider 分组,避免树结构嵌套过深。 ChangeNotifierProvider在模型不再需要时会自动释放它。- 切勿使用可能随时间变化的变量来创建 Provider 的对象——变量变化时,该对象不会更新。请改用
ProxyProvider。 - 如果有 150 个以上的 Provider,可考虑分阶段挂载(例如,在启动画面期间),而不是一次性全部挂载,以避免
StackOverflowError。
3. 使用状态
始终指定泛型类型以确保类型安全:
// Listen and rebuild on change — only valid inside build() or a Provider's update method
final count = context.watch<MyModel>().count;
// Access without listening — use in callbacks, not inside build()
context.read<MyModel>().increment();
// Listen to only part of the state
final count = context.select<MyModel, int>((m) => m.count);
当需要精细控制重建,且无法访问后代 BuildContext 时,请使用 Consumer<T> 或 Selector<T, R> 组件:
Consumer<MyModel>(
builder: (context, model, child) => Text('${model.count}'),
child: const ExpensiveWidget(), // rebuilt only once
)
Selector<MyModel, int>(
selector: (_, model) => model.count,
builder: (_, count, __) => Text('$count'),
)
4. ProxyProvider
对于依赖其他 Provider 或可能变化的值的对象,请使用 ProxyProvider 或 ChangeNotifierProxyProvider:
MultiProvider(
providers: [
Provider<Auth>(create: (_) => Auth()),
ProxyProvider<Auth, Api>(
update: (_, auth, __) => Api(auth.token),
),
],
)
5. 规则
- 不要在
initState或构造函数中访问 Provider——请在build、回调或组件完全挂载后的生命周期方法中使用它们。 - 状态可以是任意对象,不一定是
ChangeNotifier;必要时,可在StatefulWidget中使用Provider.value()。
6. 调试
实现 toString 或 DiagnosticableTreeMixin,以便对象能在 Flutter DevTools 中更清晰地显示:
class MyModel with DiagnosticableTreeMixin {
final int count;
MyModel(this.count);
@override
String toString() => 'MyModel(count: $count)';
}
7. 迁移:ValueListenableProvider
ValueListenableProvider 已弃用。请改用 Provider 和 ValueListenableBuilder:
ValueListenableBuilder<int>(
valueListenable: myValueListenable,
builder: (context, value, _) {
return Provider<int>.value(
value: value,
child: MyApp(),
);
},
)
参考资料
评论
支持 Markdown