mcpField
P
provider

provider

github.com/evanca开发663198 次安装3 周前更新
代码仓库

关于 provider

面向 Flutter 开发者的 `provider` 使用指南,涵盖状态提供、读取、依赖管理与调试,并说明常见生命周期注意事项。

主要功能

  1. 01Provider 类型选择
  2. 02状态监听与读取
  3. 03依赖对象更新管理
  4. 04细粒度重建
  5. 05调试与迁移建议

适用场景

  1. 01为 Flutter 应用选择状态提供方式
  2. 02按需读取或监听组件状态
  3. 03处理依赖其他 Provider 的对象
  4. 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