Перетаскиваемый запуск неправильной информации при наведении курсора на Dragtarget во Flutter
Я работаю с перетаскиваемыми объектами и целями перетаскивания во Flutter. В настоящее время в моем проекте есть две цели для перетаскивания, обе реагируют правильно, когда я перетаскиваю их. Однако после завершения первого перетаскивания с draggable1 на dragtarget1 второе перетаскивание вызывает проблему: при наведении курсора (не отбрасывании) над dragtarget2 с помощью draggable2 срабатывает свойство onaccept и dragtarget2 строится с содержимым dragtarget1. Не понимаю почему. Буду благодарен за любую помощь / советы!
Я сделал короткое видео с визуальным представлением проблемы: https://youtu.be/IJa3oZ_7fw0
Вот мой код для dragtarget:
Widget build(BuildContext context) {
bool isSuccessful = false;
int caughtData;
return SafeArea(
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Container(
height: 70,
width: 200,
color: Colors.grey.shade600,
child: DragTarget<int>(
builder: (context, List<int> candidateData, rejectedData) {
return isSuccessful
? FlatButton(
color:
chordBrain.chordBank[caughtData].buttoncolor,
child:
Text(chordBrain.chordBank[caughtData].chord),
onPressed: () {
playSound(noteBrain.noteBank[caughtData].note1);
playSound(noteBrain.noteBank[caughtData].note2);
playSound(noteBrain.noteBank[caughtData].note3);
playSound(noteBrain.noteBank[caughtData].note4);
},
)
: Container();
},
onWillAccept: (int data) {
print('$data');
return true;
},
onAccept: (int data) {
print('$data');
isSuccessful = true;
caughtData = data;
},
),
),
),
SizedBox(
width: 8,
),
Expanded(
child: Container(
height: 70,
width: 200,
color: Colors.grey.shade600,
child: DragTarget<int>(
builder: (context, List<int> candidateData, rejectedData) {
return isSuccessful
? FlatButton(
color:
chordBrain.chordBank[caughtData].buttoncolor,
child:
Text(chordBrain.chordBank[caughtData].chord),
onPressed: () {
playSound(noteBrain.noteBank[caughtData].note1);
playSound(noteBrain.noteBank[caughtData].note2);
playSound(noteBrain.noteBank[caughtData].note3);
playSound(noteBrain.noteBank[caughtData].note4);
},
)
: Container();
},
onWillAccept: (int data) {
print('$data');
return true;
},
onAccept: (int data) {
print('$data');
isSuccessful = true;
caughtData = data;
},
),
),
),
],
),
1 ответ
Вроде нашел решение, не очень элегантно, но работает. Хотя я до сих пор не понимаю, почему мои перетаскиваемые объекты запускают сборку при наведении (а не отбрасывании) над целями перетаскивания, проблема была решена за счет того, что цели перетаскивания стали более непохожими друг на друга. Вместо того, чтобы назначать обеим моим dragtarget одинаковые переменные bool и int для запуска виджета сборки, я дал им уникальные переменные:
Widget build(BuildContext context) {
bool isSuccessful = false;
bool isWorking = false;
int caughtData1;
int caughtData2;
Логическое значение isSuccessful и целое число catchData1 были присвоены первой цели перетаскивания, isWorking и catchData2 назначены второй цели перетаскивания. Я также удалил код onWillAccept - хотя не уверен, что это было необходимо. Полный код выглядит следующим образом:
Widget build(BuildContext context) {
bool isSuccessful = false;
bool isWorking = false;
int caughtData1;
int caughtData2;
return SafeArea(
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Container(
height: 70,
color: Colors.grey.shade600,
child: DragTarget<int>(
builder: (context, List<int> candidateData, rejectedData) {
return isWorking
? FlatButton(
color:
chordBrain.chordBank[caughtData1].buttoncolor,
child:
Text(chordBrain.chordBank[caughtData1].chord),
onPressed: () {
playSound(
noteBrain.noteBank[caughtData1].note1);
playSound(
noteBrain.noteBank[caughtData1].note2);
playSound(
noteBrain.noteBank[caughtData1].note3);
playSound(
noteBrain.noteBank[caughtData1].note4);
},
)
: Container();
},
onAccept: (int data) {
print('$data');
caughtData1 = data;
isWorking = true;
},
),
),
),
SizedBox(
width: 8,
),
Expanded(
child: Container(
height: 70,
color: Colors.grey.shade600,
child: DragTarget<int>(
builder: (context, List<int> candidateData, rejectedData) {
return isSuccessful
? FlatButton(
color:
chordBrain.chordBank[caughtData2].buttoncolor,
child:
Text(chordBrain.chordBank[caughtData2].chord),
onPressed: () {
playSound(
noteBrain.noteBank[caughtData2].note1);
playSound(
noteBrain.noteBank[caughtData2].note2);
playSound(
noteBrain.noteBank[caughtData2].note3);
playSound(
noteBrain.noteBank[caughtData2].note4);
},
)
: Container();
},
onAccept: (int data) {
print('$data');
caughtData2 = data;
isSuccessful = true;
},
),
),
),
],
),