- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个片段:
final countProvider = StateProvider<int>((ref) {
return 0;
});
class CountWidget extends ConsumerWidget {
const CountWidget();
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(countProvider);
return Column(
children: [
Text(count.toString()),
IconButton(
icon: const Icon(Icons.add),
onPressed: () {
ref.read(countProvider.notifier).state++;
},
),
],
);
}
}
这是一个非常简化的代码,但其思想是它使用了状态提供程序。
我想编写一个测试并验证在一些操作之后,提供者处于特定状态(不依赖于 UI,在这里我可以使用 find.text()
,但是我的状态可能要复杂得多)。
我想在抽取我的小部件后在我的测试中访问该模型:
await tester.pumpWidget(const CountWidget());
await tester.tap();
await tester.pump();
// ... Some other actions.
final currentCountState = // ?
expect(currentCountState, 3); // For example.
我该怎么做?
最佳答案
ProviderScope
有一个静态方法 .containerOf
它返回当前 context
的更接近 ProviderScope
的 ProviderContainer
。
假设您想要使用键 Key('key')
为小部件关联/激活 WidgetRef ref
,您可以获得它的 context
与 tester.element
.然后你可以使用ProviderScope.containerOf
:
final context = tester.element(find.byType(Key('key')));
final providerContainter = ProviderScope.containerOf(context); // <- Your `ref`.
在这里,CountWidget
extends ConsumerWidget
,ConsumerStatefulWidget
又扩展了 StatefulWidget
。
在riverpod的代码中,我们可以看到创建的state其实是一个_ConsumerState
:
class _ConsumerState extends ConsumerState<ConsumerWidget> {
@override
WidgetRef get ref => context as WidgetRef;
@override
Widget build(BuildContext context) {
return widget.build(context, ref);
}
}
context
和 ref
实际上是同一个对象。
这是因为在 ConsumerStatefulWidget
中:
/// A [StatefulWidget] that can read providers.
abstract class ConsumerStatefulWidget extends StatefulWidget {
/// A [StatefulWidget] that can read providers.
const ConsumerStatefulWidget({Key? key}) : super(key: key);
@override
// ignore: no_logic_in_create_state
ConsumerState createState();
@override
ConsumerStatefulElement createElement() {
return ConsumerStatefulElement(this);
}
}
关联元素(用于context
的是ConsumerStatefulElement
:
class ConsumerStatefulElement extends StatefulElement implements WidgetRef {
// ...
}
所以在测试中,可以使用tester.element
获取ref
:
await tester.pumpWidget(const CountWidget());
await tester.tap();
await tester.pump();
// ... Some other actions.
final ref = tester.element<ConsumerStatefulElement>(find.byType(CountWidget));
final currentCountState = ref.read(countProvider);
expect(currentCountState, 3); // For example.
关于flutter - Riverpod - 如何在测试中访问提供者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72472198/
我有一个应用程序,需要在提要屏幕上显示视频上传进度指示器。返回上传进度的代码位于视频客户端类中,该类不在 Feed 屏幕的小部件树中,并且在视频开始上传时,Feed 屏幕甚至没有打开。 我想要做的是使
我正在尝试学习 Riverpod,我有一个 ChangeNotifierProvider,它有一些字段需要使用从异步操作返回的值进行初始化。这可能吗,据我所知,我无法异步创建 ChangeNotifi
我一直在尝试使用从我的auth Provider获得的uid创建流到Firestore文档的流: class AuthService { ... static final provider =
我有这个片段: final countProvider = StateProvider((ref) { return 0; }); class CountWidget extends Consum
我有这个片段: final countProvider = StateProvider((ref) { return 0; }); class CountWidget extends Consum
我有两个 StateNotifierProvider,想在一个小部件中监听这两个状态变化。我能想到的一种方法是嵌套两个 ProviderListener。但是,如果在 Bloc 包中有一个类似于 Mu
我正在尝试联系 Riverpod,但遇到了一些问题。 我创建了一个用于登录用户的表单,我试图在用户登录时更改主视图。我的问题是,当我设置更改状态并导航回应用程序根目录时,新状态似乎不可用。但是,如果我
我正在学习 Flutter。大多数教程使用 Provider 包,但 Youtube 上的其他一些教程使用 GetX。我搜索了一下,发现似乎还有其他软件包,如 Bloc、Riverpod 等。 我一头
我习惯于调用提供者的 Provider.of() 来从小部件树的其他位置获取提供者,但我发现的每个 Riverpod 资源都依赖于对提供者变量的访问权限(通过将两个小部件放在同一个文件中)。对于仅通过
假设我想通过使用 TextFormField 上的 initialValue: 属性来初始化文本字段,并且我需要来自提供者的初始值。我在 docs 上阅读从 build 方法内部调用 read() 被
我编写了一些代码,为 StateNotifier 提供 ApiService。 ApiService 依赖于 authenticatorclient - auth 客户端必须异步创建,因为它使用 sh
我正在开发一个新的应用程序并使用状态通知器测试 Riverpod,并且有一个关于在构建页面时可以在哪里加载初始数据的问题。 我有以下状态类: abstract class SalesOrderList
当我点击他们网页上的后退按钮时,我在 StateNotifiers 中收到此错误。我已经将它隔离到发生在 longRunningAPI 的地方请求如下。 Exception has occurred.
我正在使用提供程序进行状态管理(实际上是 riverpod )在我的项目中,我有一个选项卡 View 并将每个选项卡用于一个类别,每个选项卡都显示新闻列表。 tabview 大小不固定,我对所有选项卡
我正在使用提供程序进行状态管理(实际上是 riverpod )在我的项目中,我有一个选项卡 View 并将每个选项卡用于一个类别,每个选项卡都显示新闻列表。 tabview 大小不固定,我对所有选项卡
我在提供程序中有多个值(在类中),当我在提供程序中使用 autoDispose 修饰符时,我只想处理提供程序中的几个值是否可以这样做? 我已在互联网上搜索过此内容,但没有找到与此要求相关的任何资源。
我想手动覆盖我的 StateNotifierProvider 状态以进行测试。可以使用 ProviderContainer 或 ProviderScope 覆盖提供程序。但它只提供覆盖通知程序的选项,
在使用 Riverpod 作为我的状态管理工具时,我一直在使用我发现的反模式。我做了用户问的this question did: 更新你想改变的属性并添加state = state。这个解决方案一直有
我有一个非常大、复杂的应用程序,其中包含许多页面,其中包含带有大量字段(文本、日期选择、组合框等)的输入表单,因此状态相当大。我正在从 Provider 切换到 Riverpod,建议的状态管理方式似
我有一个 StateNotifierProvider这取决于 FutureProvider .目前它们如下所示。 final catalogProvider = StateNotifierProvid
我是一名优秀的程序员,十分优秀!