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

时间:2021-05-23 19:49:51

标签: flutter riverpod

我正在尝试更新 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 不起作用。

1 个答案:

答案 0 :(得分:1)

而不是:

context.read(recenterProvider).toggle()

你需要做的:

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