Flutter中如何在DragTarget.onMove回调内获取全局坐标
你遇到的是Flutter官方文档描述与实际实现不符的已知问题,DragTargetDetails.offset 实际返回的是拖拽起始指针位置到当前指针位置的相对偏移,并非文档标注的全局位置,该属性本身仅在需要计算拖拽移动距离的场景适用,要获取全局位置或DragTarget内部相对位置可以用以下方案实现:
方案1:获取指针全局位置
直接复用Draggable.onDragUpdate返回的全局位置即可,你提供的示例中已经定义了存储全局位置的变量_dragUpdateOffset,直接在DragTarget.onMove回调中读取该变量即可拿到实时全局坐标:
onMove: (details) { // 此处_dragUpdateOffset即为当前指针的全局位置 _moveOffset = _dragUpdateOffset; setState(() {}); },
方案2:获取指针在DragTarget内部的相对位置
如果需要计算指针落在DragTarget内部的相对坐标(左上角为原点),可以借助GlobalKey获取DragTarget的位置后计算:
- 先在State中定义GlobalKey绑定DragTarget:
final GlobalKey _dragTargetKey = GlobalKey();
- 将Key绑定到DragTarget的根组件上:
SizedBox( key: _dragTargetKey, width: 100, height: 100, child: Container( child: const Text("DragTarget"), decoration: const BoxDecoration(color: Colors.green), ), )
- 在onMove回调中计算相对位置:
onMove: (details) { final renderBox = _dragTargetKey.currentContext?.findRenderObject() as RenderBox?; if (renderBox == null) return; // 获取DragTarget左上角的全局坐标 final targetGlobalOffset = renderBox.localToGlobal(Offset.zero); // 计算指针在DragTarget内部的相对坐标 final localInTarget = _dragUpdateOffset - targetGlobalOffset; _moveOffset = localInTarget; setState(() {}); },
关于DragTargetDetails.offset的适用场景
该值本质是当前指针全局位置减去拖拽起始时的指针位置,仅适合不需要知道绝对坐标,仅需要统计拖拽移动距离的场景,比如自定义拖拽跟随组件的位移计算等,其余场景实用性较低,不建议使用。
内容的提问来源于stack exchange,提问作者Eldar Prylutskyi
相关产品推荐
相关产品推荐

