【问题标题】:Riverpod context.read() just returns the data type in the provider, so I can't update the valueRiverpod context.read() 只是返回提供程序中的数据类型,所以我无法更新值
【发布时间】:2021-05-23 19:49:51
【问题描述】:

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

【问题讨论】:

    标签: flutter riverpod


    【解决方案1】:

    而不是:

    context.read(recenterProvider).toggle()
    

    你需要做的:

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

    【讨论】:

    • 什么时候需要调用 .notifier,什么时候不需要?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 2021-11-29
      • 2021-07-28
      • 2021-05-30
      • 2021-01-25
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多