Мне нужно оживить виджет Draggable
, пока он находится в движении. Анимация зависит от глобальных координат перемещаемого виджета. Я использовал Listener
, чтобы получить положение касания пальца, но проблема в том, что виджет feedback
виджета Draggable
не обновляется с помощью setState
. Я нашел это, this, this и this, но ни один из них не помог. Вот код, демонстрирующий мою проблему.
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()})')),
),
),
),
),
),
);
}
}
В этом случае координаты, отображаемые на синем экране, должны анимироваться, но даже после выполнения setState
они не обновляются. Я пробовал использовать AnimatedBuilder
, но разницы не было. Было бы действительно полезно, если бы кто-нибудь мог предоставить мне некоторую помощь или альтернативный метод для достижения этой цели с помощью виджета Draggable
.
AnimationController
используйтеValueNotifier<Offset>
, а затем удалитеsetState
и просто используйтеnotifier.value = opm.position
- такжеValueListenableBuilder
предпочтительнее в этом случае 30.09.2020