拖动时 DragTarget 不接收数据。例如拖动时,方块A进入黄色方块,但在黄色方块中,符号A等不出现。这是一个示例,完整的代码。
主要.dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Name App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Name Page'),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _str;
@override
void initState() {
super.initState();
_str = '';
}
@override
void dispose() {
super.dispose();
}
void _f1() {
setState(() {
});
}
Draggable _widDraggable(String text, Color color) =>
Draggable(
//данные
data: text,
//отображение виджета в начальной точке
child: Container(
width: 100.0,
height: 100.0,
color: color,
alignment: Alignment.center,
child: Text(
text,
style: TextStyle(
fontSize: 18,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
//отображение виджета во время перетаскивания
feedback: Container(
width: 100.0,
height: 100.0,
color: color,
alignment: Alignment.center,
child: Text(
text,
style: TextStyle(
fontSize: 18,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
//отображение виджета в начальной точке во время перетаскивания
//чтобы не оставался виджет в начальной точке во время перетаскивания
//Container нужно оставить пустым
childWhenDragging: Container(),
//вызывается, когда виджет перетаскивается на DropTarget
//DropTarget ПРИНЯЛ виджет
onDragCompleted: () {
setState(() {
});
},
//вызывается, когда виджет перетаскивается на DropTarget
//DropTarget НЕ ПРИНЯЛ виджет и виджет отбрасывается
//содержит скорость и смещение
onDraggableCanceled: (Velocity velocity, Offset offset) {
setState(() {
//позиция виджета = смещению виджета
});
},
//вызывается, когда виджет начинают перетаскивать
onDragStarted: () {
setState(() {
});
},
//вызывается, когда виджет отбрасывается
//содержит скорость и смещение
onDragEnd: (DraggableDetails details) {
setState(() {
});
},
);
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Align(
alignment: Alignment.topLeft,
child: _widDraggable('A', Colors.red),
),
Align(
alignment: Alignment.topCenter,
child: _widDraggable('B', Colors.green),
),
Align(
alignment: Alignment.topRight,
child: _widDraggable('C', Colors.blue),
),
Align(
alignment: Alignment(0.0, 0.85),
child: DragTarget(
//создание содержимого этого виджета
builder: (
BuildContext context,
//список перетаскиваемых данных, которые будут приняты
List<String> candidateData,
//список перетаскиваемых данных, которые не будут приняты
List<dynamic> rejectedData) {
return Container(
width: 150.0,
height: 150.0,
color: Colors.amber,
alignment: Alignment.center,
child: Text(
_str,
style: TextStyle(
fontSize: 32.0,
fontWeight: FontWeight.bold,
color: Colors.white
),
),
);
},
//вызывается если данные Draggable совпадают с указанными данными
//и возвращает true
onWillAccept: (data) {
return data == 'A' || data == 'B' || data == 'C';
},
//если Draggable перетаскивается на DragTarget и onWillAccept
//возвращает true, тогда вызывается onAccept
//здесь данные передаются виджет, возвращаемый builder
onAccept: (data) {
setState(() {
_str = data;
});
},
),
),
],
);
}
}
指定数据类型(在泛型中也是如此),动态是邪恶的。