I need to animate a Draggable
widget while it is in motion. The animation depends on the global position coordinates of the widget being dragged. I've used a Listener
to get the finger tap position but the problem is that the feedback
widget of the Draggable
widget is not updating with setState
. I found this, this, this and this link but none of them helped.
Here's the code to demonstrate my problem.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
double x = 0, y = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Listener(
onPointerMove: (opm) {
setState(() {
x = opm.position.dx;
y = opm.position.dy;
});
print('(${x.floor()}, ${y.floor()})');
},
child: Center(
child: Draggable(
childWhenDragging: Container(),
child: Container(
height: 150,
width: 150,
color: Colors.red,
),
feedback: Material(
child: Container(
height: 150,
width: 150,
color: Colors.blue,
child: Center(child: Text('(${x.floor()}, ${y.floor()})')),
),
),
),
),
),
);
}
}
In this case, the coordinates displayed inside the blue screen should animate but even after doing a setState
they don't update. I tried using AnimatedBuilder
but there was no difference. It would be really helpful if someone could provide me with some help or an alternative method for achieving this with the Draggable
widget.
I don't understand this part fully but with pskink's help and with some documentations I was able to achieve this animation using the following code.
Please comment if you have any better way of doing this or if you'd like to add some extra information or explanations.