part of cool_ui; /** * @Author: thl * @GitHub: https://github.com/Sky24n * @JianShu: https://www.jianshu.com/u/cbf2ad25d33a * @Email: 863764940@qq.com * @Description: Widget Util. * @Date: 2018/9/10 */ /// Widget Util. class _WidgetUtil { 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); } } }); } /// Widget渲染监听. void asyncPrepares(bool isOnce, ValueChanged onCallBack) { if (_hasMeasured) return; WidgetsBinding.instance.addPostFrameCallback((Duration timeStamp) { if (isOnce) _hasMeasured = true; if (onCallBack != null) onCallBack(null); }); } ///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); } }