Riverpod context.read() 只是 returns 提供程序中的数据类型,所以我无法更新值

Riverpod context.read() just returns the data type in the provider, so I can't update the value

我正在尝试更新 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,
          );
        },
      ),
...

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

而不是:

context.read(recenterProvider).toggle()

您需要做的:

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

在我的例子中,我将上下文声明为可为空 BuildContext? context。在这种情况下,您只能通过空检查访问 read-方法,如下所示:context!.read(<provider>)

@Vandit Shan 你找到解决办法了吗?我被困在这里。 有的话请分享。

引用:

( flutter 版本 3.0.1,嘿@remi,我正在使用 context.read,但它显示 BuildContext 没有读取方法。也通过使用 provider.dart 如下 context.read().joinCall(channelName: _chchannel);它抛出错误,因为“运算符 '<' 没有为类型 'T Function()' 定义。\n尝试定义运算符 '<'。”,请帮助 – 万迪沙 5 月 26 日 14:56 )