Я создаю колоду карт, в которой я хотел бы, чтобы пользователь касался колоды карт, чтобы выбрать карту, а затем перемещал большой палец (указатель) влево / вправо, чтобы отрегулировать выбор. Например, пользователь дотронулся до 2 клубов, но когда они перемещают большой палец горизонтально вправо и на 3 из клубов, то затем будет выбран.
Я экспериментируюс трепетанием, и я попытался добиться этого с помощью класса GestureDetector.Но я ожидал, что GestureDetector.onHorizontDragUpdate будет вызываться на 3 из клубов, когда я перехожу на карту, но, похоже, он обращается к виджету, где я коснулся (2 из клубов).
Вот мой пример кода:
class Deck extends StatefulWidget {
Deck({Key key, this.title}) : super(key: key);
final String title;
@override
_DeckState createState() => new _DeckState();
}
class _DeckState extends State<Deck> {
List<String> _cards = ['s7', 's8', 's10', 'sk', 'h10', 'hq', 'c2', 'c3', 'd6', 'dj', 'dq', 'dk', 'da'];
String _selectedCard;
void _onButtonPressed() {
}
void _selectCard(String card){
print(card);
setState(() {
if(_selectedCard == card)
return;
_selectedCard = card;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Stack(
children: _cards
.asMap()
.map<int, Positioned>((i, c){
var positioned = Positioned(
left: i * 25.0,
top: c == _selectedCard ? 10.0 : 30.0,
width: 71.0,
height: 96.0,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onHorizontalDragDown: (e) => _selectCard(c),
onHorizontalDragUpdate: (e) => _selectCard(c),
child: Image(
image: new AssetImage('assets/$c.gif'),
),
),
);
return MapEntry(i, positioned);
})
.values
.map((c) => c)
.toList()
),
floatingActionButton: new FloatingActionButton(
onPressed: _onButtonPressed,
tooltip: 'Increment',
child: new Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
Разве GestureDetector не подходит для этого?Как мне этого добиться?Обратите внимание, что я пробовал Listener.PointerMoveEvent, но, похоже, он ведет себя так же, отправляя событие перемещения в виджет, где произошло приземление, а не в новый виджет.