0

我正在尝试为我的颤振小部件编写测试。

假设我有这个有状态的小部件:

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


我想知道在颤振测试中强制重建小部件的正确方法是什么?

4

0 回答 0