如何在Flutter小部件上模拟点击事件?

NET*_*ET3 5 dart flutter

如何在Flutter小部件上模拟点击事件?

例如,如何模拟在Tabbar标题上的点击?更重要的是,我如何首先找到小部件?请注意,我不想调用相关的回调,也不想使用Flutter测试类来测试窗口小部件,但我想模拟运行时在窗口小部件上的轻敲。

编辑1:(请注意)我不想测试一个小部件或调用分配给GestureDetector.onTap或RaisedButton.onPressed等的方法...

use*_*613 10

用于GestureBinding模拟屏幕上任意位置的单击事件。

例如:

GestureBinding.instance.handlePointerEvent(
    PointerDownEvent(position: Offset(200, 300)),
)
Run Code Online (Sandbox Code Playgroud)

演示动图

完整示例:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            ElevatedButton(
              onPressed: () {},
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.red[900],
              ),
              child: const SizedBox(
                width: 400,
                height: 400,
                child: Center(child: Text("I'm a big button.")),
              ),
            ),
            ElevatedButton(
              onPressed: () async {
                GestureBinding.instance
                    .handlePointerEvent(const PointerDownEvent(
                  position: Offset(200, 300),
                ));
                await Future.delayed(const Duration(milliseconds: 500));
                GestureBinding.instance
                    .handlePointerEvent(const PointerUpEvent(
                  position: Offset(200, 300),
                ));
              },
              child: const Text('Simulate Click'),
            ),
          ],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


Rém*_*let 9

首先,获得一个RenderBox. 然后只需调用hitTest方法。任何都可以,只要它安装在树上。

为此,您必须使用BuildContextthrough context.findRenderObject()

BuildContext context;

final renderObj = context.findRenderObject();
if (renderObj is RenderBox) {
  final hitTestResult = HitTestResult();
  if (renderObj.hitTest(hitTestResult, position:  /* The offset where you want to "tap" */)) {
    // a descendant of `renderObj` got tapped
    print(hitTestResult.path);
  }
}
Run Code Online (Sandbox Code Playgroud)