part of cool_ui; class WidgetUtils { bool _hasMeasured = false; double _width; double _height; /// Widget rendering listener. /// Widget渲染监听 /// context: Widget context /// isOnce: true,Continuous monitoring false,Listen only once. /// onCallBack: Widget Rect CallBack void asyncPrepare( BuildContext context, bool isOnce, ValueChanged onCallBack) { if (_hasMeasured) return; WidgetsBinding.instance.addPostFrameCallback((Duration timeStamp) { RenderBox box = context.findRenderObject(); if (box != null && box.semanticBounds != null) { if (isOnce) _hasMeasured = true; double width = box.semanticBounds.width; double height = box.semanticBounds.height; if (_width != width || _height != height) { _width = width; _height = height; if (onCallBack != null) onCallBack(box.semanticBounds); } } }); } ///get Widget Bounds (width, height, left, top, right, bottom and so on).Widgets must be rendered completely. ///获取widget Rect static Rect getWidgetBounds(BuildContext context) { RenderBox box = context.findRenderObject(); return (box != null && box.semanticBounds != null) ? box.semanticBounds : Rect.zero; } ///Get the coordinates of the widget on the screen.Widgets must be rendered completely. ///获取widget在屏幕上的坐标,widget必须渲染完成 static Offset getWidgetLocalToGlobal(BuildContext context) { RenderBox box = context.findRenderObject(); return box == null ? Offset.zero : box.localToGlobal(Offset.zero); } }