我正在尝试为我的颤振小部件编写测试。
假设我有这个有状态的小部件:
class A extends StatefulWidget {
const A();
@override
AState createState() => AState();
}
class AState extends State<A> {
bool value = false;
@override
Widget build(BuildContext context) {
final newValue = getNewValue(); // When the widget is rebuilt, I'm getting a value which can be `false` or `true`. I just want the widget to perfom actions if it changed;
if (value != newValue) {
setState(() {
value = newValue;
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
if (mounted) {
// Do something, like show a snackbar for example
}
});
}
return const SizedBox.shrink();
}
}
当小部件重建时,它会查看来自的值是否已getNewValue
更改并重建自身,然后使用WidgetsBinding.instance.addPostFrameCallback
. getNewValue
(我只希望小部件在重建时执行此操作,在我的情况下不需要订阅)。
无论如何,我为此编写了一个测试以及我在哪里抽取小部件
// Mock `getNewValue` here so it returns `true`
const widget = A();
await tester.pumpWidget(widget);
await tester.pump();
// Verify the action after the `WidgetsBinding.instance.addPostFrameCallback` as been done
效果很好。
但现在我想强制小部件重建以测试其行为。
这就是我设法做到的(我称之为setState
):
// Mock `getNewValue` here so it returns `false` (change since last build)
tester.state<AState>(find.byType(A)).setState(() {});
await tester.pump();
await tester.pump();
// Verify the action after the `WidgetsBinding.instance.addPostFrameCallback` as been done
这也很好用。
但是,调用setState
会引发警告
The member 'setState' can only be used within instance members of subclasses of 'package:flutter/src/widgets/framework.dart'.dart(invalid_use_of_protected_member)
这个技巧对StatelessWidget
我想知道在颤振测试中强制重建小部件的正确方法是什么?