如何获取MouseRegion组件中鼠标位置的归一化坐标?
Flutter MouseRegion 获取归一化坐标解决方案
针对动态布局下无法直接获取MouseRegion组件尺寸来计算归一化坐标的问题,有两种可靠的实现方式:
方法一:使用GlobalKey获取实时尺寸
通过给MouseRegion(或其直接父容器)绑定GlobalKey,在鼠标悬停回调中获取组件的实时尺寸,再将像素坐标转换为归一化坐标:
final _mouseRegionKey = GlobalKey(); // 组件实现 MouseRegion( key: _mouseRegionKey, onHover: (PointerHoverEvent event) { final size = _mouseRegionKey.currentContext?.size; if (size != null && size.width > 0 && size.height > 0) { // 计算归一化坐标(左上角为(0.0,0.0),右下角为(1.0,1.0)) final normalizedX = event.localPosition.dx / size.width; final normalizedY = event.localPosition.dy / size.height; // 这里处理归一化坐标逻辑 print('归一化坐标:($normalizedX, $normalizedY)'); } }, child: Container( // 你的复杂布局内容 ), )
注意:必须使用event.localPosition(相对于当前组件的坐标),而非全局屏幕坐标event.position;首次触发hover时需判空,确保组件已完成布局。
方法二:使用LayoutBuilder动态获取约束尺寸
通过LayoutBuilder包裹MouseRegion,直接获取当前组件的布局约束(即实时宽高),无需全局key,更适合动态变化的布局场景:
LayoutBuilder( builder: (context, constraints) { final width = constraints.maxWidth; final height = constraints.maxHeight; return MouseRegion( onHover: (PointerHoverEvent event) { if (width > 0 && height > 0) { final normalizedX = event.localPosition.dx / width; final normalizedY = event.localPosition.dy / height; // 处理归一化坐标逻辑 print('归一化坐标:($normalizedX, $normalizedY)'); } }, child: Container( width: width, height: height, // 你的复杂布局内容 ), ); }, )
这种方式的优势是:布局发生变化(如窗口缩放、组件重绘)时,constraints会自动更新,回调中始终能拿到最新的尺寸数据。
内容的提问来源于stack exchange,提问作者HiFile.app - best file manager
相关产品推荐
相关产品推荐

