使用 2 个类型参数声明类型“StateNotifierProvider”,但给出了 1 个类型参数

Posted

技术标签:

【中文标题】使用 2 个类型参数声明类型“StateNotifierProvider”,但给出了 1 个类型参数【英文标题】:The type 'StateNotifierProvider' is declared with 2 type parameters, but 1 type arguments were given 【发布时间】:2021-07-17 20:49:58 【问题描述】:

在我想用 Riverpod 管理状态的 Flutter 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&lt;CounterStateNotifier&gt; 中的&lt;CounterStateNotifier&gt; 类型参数会消除错误。但是,尝试读取提供程序并调用其increment 方法(将() =&gt; context.read(counterProvider).increment() 设置为onPressedElevatedButton,然后按下按钮)会出现以下运行时错误:

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

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


我应该提到我正在网络上运行我的应用程序(flutter run -d Chrome)。

【问题讨论】:

【参考方案1】:

从 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。

【讨论】:

谢谢!!!为什么StateNotifierProvider 类文档中没有这个。我已经挣扎了大约一天试图让它发挥作用。 pub.dev/documentation/riverpod/latest/riverpod/… 编辑:刚注意到master中的文档已经更新了,我想下次发布文档时会有新的API。 只是在同一个问题上搞砸了一个小时左右,直到我偶然发现了这篇 SO 帖子。更新的文档会帮助其他人【参考方案2】:

如果 StateNotifierProvider 的值,您也可以使用 dynamic 来接受任何类型

final modelProvider =
    StateNotifierProvider.autoDispose<ModelClassName, dynamic>(
        (ref) => ModelClassName());

【讨论】:

以上是关于使用 2 个类型参数声明类型“StateNotifierProvider”,但给出了 1 个类型参数的主要内容,如果未能解决你的问题,请参考以下文章

写出java中定义方法的语法格式,并说明一个方法可以有多少个参数,多少个返回值?

Java泛型方法和构造函数

是否可以有一个带有 1 个未声明类型的输入参数的构造函数?

C#函数的使用方法

条件参数和返回类型声明(又名类型提示)

Python函数的参数类型