Riverpod context.read() 仅返回提供程序中的数据类型,因此我无法更新该值

问题描述

我正在尝试更新 RecenterProvider 中的值,我正在使用 StateNotifierProvider 创建该值,但是 read()(在回调中更新值的推荐方法)刚刚返回bool 而不是实际的提供者。

这是RecenterProvider

class RecenterProvider extends StateNotifier<bool> {
  RecenterProvider() : super(true);

  void toggle() => state = !state;
}

这是我的小部件:

  final recenterProvider =
      StateNotifierProvider.autodispose<RecenterProvider,bool>(
          (_) => RecenterProvider());

...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ...
      floatingActionButton: Consumer(
        builder: (context,watch,_) {
          return FloatingActionButton(
            child: Icon(
              Icons.my_location,color: watch(recenterProvider)
                  ? Theme.of(context).accentColor
                  : Theme.of(context).primaryIconTheme.color,),onpressed: () {
              // This fails because read() returns a bool instead of a RecenterProvider
              context.read(recenterProvider).toggle();
            },backgroundColor: Theme.of(context).scaffoldBackgroundColor,);
        },...

我在此处创建 StateNotifierProvider 而不是在 main.dart 中,因为此提供程序仅在此小部件及其子部件中使用。我使用的是 Consumer,因为只有 FloatingActionButton 使用这个值,而且小部件是有状态的,所以 ConsumerWidget 不起作用。

解决方法

而不是:

context.read(recenterProvider).toggle()

你需要做的:

context.read(recenterProvider.notifier).toggle()