layoutSnapshot method

List<Map<String, dynamic>> layoutSnapshot()

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;
}