Как зафиксировать обновление указателя, когда пользователь перемещает указатель на новый виджет во флаттере - PullRequest
0 голосов
/ 09 октября 2018

Я создаю колоду карт, в которой я хотел бы, чтобы пользователь касался колоды карт, чтобы выбрать карту, а затем перемещал большой палец (указатель) влево / вправо, чтобы отрегулировать выбор.enter image description here Например, пользователь дотронулся до 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, но, похоже, он ведет себя так же, отправляя событие перемещения в виджет, где произошло приземление, а не в новый виджет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...