Val*_*nal 4 dart flutter flutter-provider flutter-state riverpod
使用provider,Providers 的作用域位于小部件树中。只有小部件的子Provider级可以访问其模型。
它在 的 doc 中说riverpod:
允许在多个位置轻松访问该状态。提供者完全替代了单例、服务定位器、依赖注入或 InheritedWidgets 等模式。
* 这里的“ Providers”指的是
Provider包的类riverpod。
这个provider包是围绕 s 的简化/包装/API InheritedWidget,所以我想 s 可以实现的功能provider也可以通过 s 实现riverpod。
但我无法找出如何做到这一点。
这是我正在尝试迁移的一个小例子。
class Counter extends ValueNotifier<int> {
Counter(): super(0);
}
class MyWidget extends StatelessWidget {
const MyWidget();
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Counter>(
create: (_) => Counter();
child: Builder(
builder: (context) {
return Row(
children: [
IconButton(
onPressed: () {
context.read<Counter>().value++;
},
icon: Icon(Icons.add),
),
Text('Count: ${context.watch<Counter>().value}'),
],
);
},
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
只要有MyWidget小部件,子小部件就可以访问唯一/作用域模型Counter。
确定提供商范围是通过ProviderScope
你可以做:
final provider = ChangeNotifierProvider<Counter>((ref) => throw UnimplementedError());
// in some widget:
return ProviderScope(
overrides: [
provider.overrideWithProvider(
ChangeNotifierProvider((ref) => Counter());
),
],
)
Run Code Online (Sandbox Code Playgroud)
不过,如果可以避免范围界定,那就这样做。通常不建议并且应该避免使用范围界定提供程序,因为这是相当高级的。
如果您使用范围提供程序,以便在用户离开页面时状态被破坏,则更简单的解决方案是使用autoDispose:
final provider = ChangeNotifierProvider.autoDispose<Counter>((ref) => Counter());
// No longer needed to scope the provider
Run Code Online (Sandbox Code Playgroud)