layoutSnapshot method
Walk the capture boundary's render subtree and emit one entry per
RenderMetaData node that AppPlayer's flutter_mcp_ui runtime wraps
rendered widgets in. Each entry carries {type, id?, text?, label?, title?, rect:[x,y,w,h]} in capture-root coordinates. Returns an
empty list when the boundary is not attached yet.
Implementation
List<Map<String, dynamic>> layoutSnapshot() {
final root = _captureRenderBox();
if (root == null) return const <Map<String, dynamic>>[];
final out = <Map<String, dynamic>>[];
void visit(RenderObject ro) {
if (ro is RenderMetaData) {
final meta = ro.metaData;
if (meta is Map<String, dynamic> && ro.hasSize && ro.attached) {
final box = ro;
final transform = box.getTransformTo(root);
final rect = MatrixUtils.transformRect(
transform,
Offset.zero & box.size,
);
final entry = <String, dynamic>{
'type': meta['type']?.toString() ?? '?',
'rect': <double>[rect.left, rect.top, rect.width, rect.height],
};
for (final key in const <String>['id', 'text', 'label', 'title']) {
final v = meta[key];
if (v is String && v.isNotEmpty) entry[key] = v;
}
out.add(entry);
}
}
ro.visitChildren(visit);
}
visit(root);
return out;
}