not*_*eal 5 animation widget widget-test-flutter
我有一个类似于以下内容的小部件测试:
testWidgets('Widget test', (WidgetTester tester) async {
provideMockedNetworkImages(() async {
final widget = MyWidget();
await WidgetTestFunctions.pumpWidgetTest(
tester,
widget,
);
// ....
await tester.tap(find.byType(MyWidget));
await tester.pump(new Duration(milliseconds: 3000));
// ....
expect(widget.value, myValue);
});
});
Run Code Online (Sandbox Code Playgroud)
以及小部件 on-tap 方法的以下实现:
_onButtonPressed() async {
await animationController.forward();
setState(() {
// ...
// Calls method that changes the widget value.
});
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,animationController.forward()在测试中调用该方法后,该setState部分未执行。我应该如何等待这个方法正确完成?在应用程序运行时,这部分代码被正确调用。
似乎await tester.pump(new Duration(milliseconds: 3000));工作不正常,动画的持续时间为 1500 毫秒,并且您可以看到泵持续时间是双倍的。
我遇到了同样的问题,这就是发生的事情。
当你这样做时
await animationController.forward();
Run Code Online (Sandbox Code Playgroud)
您等待的不是简单的Future<void>完成,而是TickerFuture(extends Future<void>)。
由于某种原因,在我的测试中,一些TickerFuture来自animationController.forward()weer 的 s 被取消了。
在 的文档中TickerProvider,它说:
如果 Ticker 在未停止的情况下被处置,或者如果在 cancelled 设置为 true 的情况下停止,则此 Future 将永远不会完成。
此类的工作方式与普通 Future 类似,但有一个附加属性 orCancel,该属性返回一个派生 Future,如果返回 TickerFuture 的 Ticker 被停止且取消设置为 true,或者如果它在未停止的情况下被处置,则该 Future 会以错误完成。
要在该 future 解决或取消股票代码时运行回调,请使用whenCompleteOrCancel。
现在的问题whenCompleteOrCancel是它会返回void(并不是Future<void>说我们不能等待它。
这就是我所做的(受到实现的启发whenCompleteOrCancel):
Future<void> thunk(dynamic value) {
return;
}
final TickerFuture ticker = animationController.forward();
await ticker.onCancel.then(thunk, onError: thunk); // <- This resolves even if the ticker is canceled and the tests are not stuck anymore.
Run Code Online (Sandbox Code Playgroud)