|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
|
|
|
|
import 'captcha_util.dart';
|
|
|
|
|
|
|
|
|
|
|
|
/// Widget Util.
|
|
|
|
class WidgetUtil {
|
|
|
|
///get Widget Bounds (width, height, left, top, right, bottom and so on).Widgets must be rendered completely.
|
|
|
|
///获取widget Rect
|
|
|
|
static Rect getWidgetBounds(BuildContext context) {
|
|
|
|
RenderObject? box = context.findRenderObject();
|
|
|
|
return (box != 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() as RenderBox?;
|
|
|
|
return box == null ? Offset.zero : box.localToGlobal(Offset.zero);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// get image width height,load error return Rect.zero.(unit px)
|
|
|
|
/// 获取图片宽高,加载错误情况返回 Rect.zero.(单位 px)
|
|
|
|
/// image
|
|
|
|
/// url network
|
|
|
|
/// local url , package
|
|
|
|
static Future<Rect> getImageWH(
|
|
|
|
{required Image image, String? url, String? localUrl, String? package}) {
|
|
|
|
if (CaptchaUtil.isEmpty(image) &&
|
|
|
|
(url == null || CaptchaUtil.isEmpty(url)) &&
|
|
|
|
(localUrl == null || CaptchaUtil.isEmpty(localUrl))) {
|
|
|
|
return Future.value(Rect.zero);
|
|
|
|
}
|
|
|
|
Completer<Rect> completer = Completer<Rect>();
|
|
|
|
Image img = image;
|
|
|
|
img.image
|
|
|
|
.resolve(const ImageConfiguration())
|
|
|
|
.addListener(ImageStreamListener(
|
|
|
|
(ImageInfo info, bool _) {
|
|
|
|
completer.complete(Rect.fromLTWH(0, 0, info.image.width.toDouble(),
|
|
|
|
info.image.height.toDouble()));
|
|
|
|
},
|
|
|
|
onError: (Object exception, StackTrace? stackTrace) {
|
|
|
|
completer.completeError(exception, stackTrace);
|
|
|
|
},
|
|
|
|
));
|
|
|
|
return completer.future;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// get image width height, load error throw exception.(unit px)
|
|
|
|
/// 获取图片宽高,加载错误会抛出异常.(单位 px)
|
|
|
|
/// image
|
|
|
|
/// url network
|
|
|
|
/// local url (full path/全路径,example:"assets/images/ali_connors.png",""assets/images/3.0x/ali_connors.png"" );
|
|
|
|
/// package
|
|
|
|
static Future<Rect> getImageWHE(
|
|
|
|
{required Image image,
|
|
|
|
String? url,
|
|
|
|
String? localUrl,
|
|
|
|
String? package}) {
|
|
|
|
if (CaptchaUtil.isEmpty(image) &&
|
|
|
|
(url == null || CaptchaUtil.isEmpty(url)) &&
|
|
|
|
(localUrl == null || CaptchaUtil.isEmpty(localUrl))) {
|
|
|
|
return Future.error("image is null.");
|
|
|
|
}
|
|
|
|
Completer<Rect> completer = Completer<Rect>();
|
|
|
|
Image img = image;
|
|
|
|
img.image
|
|
|
|
.resolve(const ImageConfiguration())
|
|
|
|
.addListener(ImageStreamListener(
|
|
|
|
(ImageInfo info, bool _) {
|
|
|
|
completer.complete(Rect.fromLTWH(0, 0, info.image.width.toDouble(),
|
|
|
|
info.image.height.toDouble()));
|
|
|
|
},
|
|
|
|
onError: (Object exception, StackTrace? stackTrace) {
|
|
|
|
completer.completeError(exception, stackTrace);
|
|
|
|
},
|
|
|
|
));
|
|
|
|
|
|
|
|
return completer.future;
|
|
|
|
}
|
|
|
|
}
|