import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; typedef OnWidgetSizeChange = void Function(Size size); class MeasureSize extends SingleChildRenderObjectWidget { final OnWidgetSizeChange onChange; const MeasureSize({super.key, required this.onChange, required Widget child}) : super(child: child); @override RenderObject createRenderObject(BuildContext context) { return _MeasureSizeRenderObject(onChange); } @override void updateRenderObject( BuildContext context, covariant _MeasureSizeRenderObject renderObject) { renderObject.onChange = onChange; } } class _MeasureSizeRenderObject extends RenderProxyBox { _MeasureSizeRenderObject(this.onChange); OnWidgetSizeChange onChange; Size? _oldSize; @override void performLayout() { super.performLayout(); Size? newSize = child?.size; if (_oldSize == newSize || newSize == null) return; _oldSize = newSize; WidgetsBinding.instance.addPostFrameCallback((_) { onChange(newSize); }); } }