import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; class MeasureSize extends SingleChildRenderObjectWidget { const MeasureSize({ super.key, required this.onChange, required Widget super.child, }); final OnWidgetSizeChange onChange; @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(); final Size newSize = child!.size; if (oldSize != newSize) { oldSize = newSize; WidgetsBinding.instance.addPostFrameCallback((_) { onChange(newSize); }); } } } typedef OnWidgetSizeChange = void Function(Size size);