tapAt method
Taps a point rather than a widget — the same press as tap, aimed where no finder can reach.
The zones of an SVG, a chart or a map are painted rather than built, so
they share one widget and one box, and tap on that box presses its
centre. Only a coordinate says which zone was meant, and before this the
nearest way to say one was dragFrom(at, Offset.zero) — the right
gesture arrived at sideways, and a step that reads dragFrom in the
report for what the author meant as a tap.
tap(Target.at(x, y)) is the same press by another name — see
_aimFor, which is the one rule both go through. What this spelling has
is that it needs no widget to resolve, and that the step it writes says
what the author meant.
The coordinates are the ones every box in a report is in: the view's logical pixels, top-left origin — what a step's aim rectangle reads back in, so a point can be lifted straight off one.
It makes the same trade dragFrom makes: there is no target to prove reachable, so it goes where it is told, and a point over nothing taps nothing silently where every finder verb would have refused.
Implementation
Future<void> tapAt(Offset at, {Shot? shot, Settle? settle}) => _step(
shot,
settle,
() async {
_aimAtPoint(at);
await _approach('tapAt');
await _pressAt(at);
},
verb: 'tapAt',
target: '${at.dx.round()},${at.dy.round()}',
);