我有一个像这样的可拖拽列表(a是一个StatefulWidget
):
Draggable(child: a, feedback: a, childWhenDragging: null, data: a)
但是,a
有一个GlobalKey,以便在小部件被丢弃时保持状态。我的问题是,当您尝试拖动时,抛出duplicate GlobalKey
错误(可能是因为child
和feedback
存在于同一帧上)。有什么方法可以实现这种行为而不会出现任何错误吗?
可再生的例子:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class SFWidget extends StatefulWidget {
const SFWidget({Key? key}) : super(key: key);
@override
State<SFWidget> createState() => SFWidgetState();
}
class SFWidgetState extends State<SFWidget> {
String str = "str";
@override
Widget build(BuildContext context) {
return Text(str);
}
void edit(String newstr) {
setState(() {
str = newstr;
});
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final key = GlobalKey<SFWidgetState>();
final widget = SFWidget(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Draggable(
child: widget,
feedback: widget,
data: widget,
childWhenDragging: null,
),
);
}
}
问题是,如果childWhenDragging
是null
,那么相同的小部件将停留在起始位置。来自官方文档:
如果
childWhenDragging
是null
,那么Draggable
小部件将始终显示子(因此在拖动过程中拖动源表示不会改变)。
因此,要修复它,只需将childWhenDragging
默认为不像Container()
那样做的东西。如下所示:
...
body: Draggable(
child: widget,
feedback: widget,
data: widget,
childWhenDragging: Container(), // <- Here
),
...