我应该如何将字符串列表传递给 Riverpod 提供商而不破坏它?

问题描述 投票:0回答:2

我正在使用带有代码生成功能的 Riverpod 进行状态管理。 在这里,我有一个名为“handle”的变量,它被传递到我的小部件的构造函数中,然后我需要将列表中的这个变量传递给网络调用函数。

网络调用代码

@riverpod
Future<List<User>?> getUsers(GetUsersRef ref, String handle) async {
    ....

}

当我在 ConsumerWidget 中使用 ref.watch(GetUsersProvider(handle)) 进行网络调用时,在这种情况下工作正常,但当我想将字符串列表传递给网络调用函数时,问题就出现了。

网络调用代码2

@riverpod
Future<List<User>?> getUsers(GetUsersRef ref, List<String> handles) async {
    ....
    print("Network call successful");
}

在这种情况下,当我调用 ref.watch(GetUsersProvider([handle]) 时,即使网络调用成功,我的小部件也会不断重建自身并且永远不会停止加载。 我该如何解决这个问题?

我尝试传递

const List<String> = ['handleName']
,这有效,但随后我无法使用传递给构造函数的句柄变量真正创建一个常量字符串列表。

你们如何使用代码生成将字符串列表传递给 Riverpod 中的提供者?

string flutter list dart riverpod
2个回答
0
投票

创建一个自定义对象,例如 - Params

class Params{
final List<String> handles;
}

当您将参数传递给 Riverpod 时。它为每个参数创建提供者。在你的情况下,它创建 list.length no。的提供商。 查看 Riverpod 中的

.family
。您的提供者使用家庭。在系列中,它通过 == 来识别每个提供者,并根据其参数来检查提供者身份。当您将列表传递给它时。因此它列出了相同的提供商但具有不同的值。 并且在provider中使用
autodispose
时建议使用
family


0
投票

来自文档 将参数传递给提供者(家庭) :

使用代码生成时,我们不再需要依赖 family 修饰符将参数传递给提供者。相反,我们提供程序的主函数可以接受任意数量的参数,包括命名、可选或默认值。

但请注意,这些参数应该仍然具有一致的 ==。意味着要么应该缓存值,要么应该覆盖参数 ==。

最后一段现在对我们很重要。我突然想到为列表制作一个不可变的包装器(使用冻结),或者使用不可变的列表类型(第三方包)。

© www.soinside.com 2019 - 2024. All rights reserved.