如何在 Riverpod 中确定提供商范围?

Val*_*nal 4 dart flutter flutter-provider flutter-state riverpod

我开始使用riverpod并尝试迁移使用provider.

使用providerProviders 的作用域位于小部件树中。只有小部件的子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

Rém*_*let 6

确定提供商范围是通过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)

  • 也许你想要“家庭”。 (3认同)