在我想用Riverpod管理其状态的Ffltter 2.0.5应用程序的上下文中,我想我可以这样声明StateNotifierProvider:

import 'package:flutter_riverpod/flutter_riverpod.dart';


final counterProvider = StateNotifierProvider<CounterStateNotifier>((ref) => CounterStateNotifier());

class CounterStateNotifier extends StateNotifier<int> {
  CounterStateNotifier([int count = 0]) : super(count);

  void increment() => state++;
}

但是Android Studio(以及后来的DART编译器)抱怨我声明counterProvider变量的那一行:

类型"StateNotifierProvider"使用%2个类型参数声明,但提供了%1个类型参数.

删除StateNotifierProvider<CounterStateNotifier>中的<CounterStateNotifier> type参数将删除错误.然而,try 读取提供者并调用其increment方法(将() => context.read(counterProvider).increment()设置为ElevatedButtononPressed,然后按下按钮)会产生以下运行时错误:

'increment'
method not found
Receiver: 0
Arguments: []

为什么context.read(counterProvider)返回int状态而不是通知程序?我问题第一部分提到的类型参数错误背后的原因是什么?


我应该提到的是,我正在网络上运行我的应用程序(有flutter run -d Chrome个).

推荐答案

从Riverpod 0.14.0开始,State是StateNotifierProvider公开的默认值.

现在,声明StateNotifierProvider的语法如下所示:

final counterProvider = StateNotifierProvider<CounterStateNotifier, int>((ref) => CounterStateNotifier());

现在访问函数需要添加.notifier(访问StateNotifier本身):

context.read(counterProvider.notifier).increment();

正如您已经注意到的,您现在可以这样访问该州:

final count = context.read(counterProvider);

更多关于变化here.

Dart相关问答推荐

为什么 Dart 程序在使用词法作用域时会根据声明变量的位置而表现不同?

如何防止 getter 或函数每次都重新计算?

浮动操作按钮:如何像 RaisedButton 一样更改启动 colored颜色 和突出显示 colored颜色 ?

在Flutter中重命名文件/图像

如何在streambuilder中查询firestore文档并更新listview

需要一个SkDeletable类型的值,但得到一个Null类型的值

如何在 ListView 中添加额外的底部间距?

Dart JavaScript 与 jQuery 的互操作回调

如何根据用户在Flitter中的时间显示问候,如早上好、下午好或晚上好

在小部件构建期间,如何在Flutter中导航?

如何从Flatter应用程序中导航到网页?(OAuth)

dart2js代码比javascript快多少?

如何从 ExpansionTile 的标题中删除默认填充

Flutter – 连续两个文本,左边一个溢出

如何循环遍历元素列表

在 Dart 中编写单元测试的最佳方式是什么?

如何在 timeLimit 之后使future 的计算超时?

Exception: Concurrent modification during iteration: Instance(length:17) of '_GrowableList';

在 Dart 中验证邮箱地址?

如何在 Dart 中将 double 转换为 int?