Как получить глобальные координаты внутри DragTarget.onMove (Flutter)?
Мне нужно получить положение перетаскивания внутри. Но у нас есть некоторые странные ценности. В исходном коде я вижу, что он установлен на
avatar._lastOffset
который
globalPosition - dragStartPoint
. Но у меня нет доступа ни к одному из них, чтобы вычислить глобальную или локальную позицию внутри DragTarget. В документации говорится, что
DragTargetDetails.offset
is 'Глобальная позиция, когда указанное событие указателя произошло на перетаскиваемом элементе'. но на самом деле это глобальная позиция минус точка начала приема наркотиков, которая кажется бесполезной, как я могу использовать это значение?
Я подготовил простой пример, где можно увидеть смещения от
Draggable.onDragUpdate
(что является реальным глобальным положением) и от
DragTarget.onMove
.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Offset _dragUpdateOffset = Offset.zero;
Offset _moveOffset = Offset.zero;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Draggable(
data: "Test Data",
child: const Text("Drag me"),
feedback: const Material(child:Text("Draggable")),
childWhenDragging: Container(),
onDragUpdate: (details) {
setState(() {
_dragUpdateOffset = details.globalPosition;
});
},
),
),
body: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text("dragUpdate: ${_dragUpdateOffset.dx},${_dragUpdateOffset.dy}"),
const Text("vs"),
Text("onMove: ${_moveOffset.dx},${_moveOffset.dy}")
],),
Expanded(
child: Center(
child: DragTarget(
onMove: (details) {
_moveOffset = details.offset;
},
onWillAccept: (data) => true,
builder: (context, candidateData, rejectedData) => SizedBox(
width: 100,
height: 100,
child: Container(
child: const Text("DragTarget"),
decoration: const BoxDecoration(color: Colors.green),
),
),
),
),
),
],
),
);
}
}
1 ответ
Попробуйте обернуть Draggable в Listener и использовать onPointerMove: (подробности).