Кнопка значка и обнаружение длительного нажатия

#android #flutter

Вопрос:

Пожалуйста, помогите мне с обнаружением длительного нажатия на иконку кнопки.

Я пытаюсь получить кнопку со значком, которая изменит значение количества на 1 при нажатии и на 10 при длительном нажатии. Проблема в том, что, к сожалению, для Flutter 2.12 отсутствует обработчик событий длительного нажатия IconButton .

Поэтому я использовал только Icon внутреннюю Container часть, как показано ниже

         GestureDetector(
          child: Container(
            child: const Icon(
              Icons.add,
            ),
            padding: EdgeInsets.symmetric(vertical: 6.0, horizontal: 18.0),
          ),
          onTap: () {
            increment(1);
          },
          onLongPressStart: (_) async {
            startPressing(() => increment(10));
          },
          onLongPressCancel: () {
            cancelPress();
          },
          onLongPressEnd: (_) {
            cancelPress();
          },
        ),
 

он работает, но проблема в том, что область нажатия очень мала, и неудобно находить точку нажатия, находясь на мобильном телефоне.

Я попытался увеличить размер значка до 48, но результат ужасен, значок неестественно большой

 const Icon(
              Icons.add,
              size: 48,
            ),
 

дизайн, который мне подходит, заключается в использовании GestureDetector (для длительного нажатия) с IconButton (и нажатой для обнаружения одного нажатия):

         GestureDetector(
          child: IconButton(
            onPressed: () => decrement(1),
            icon: const Icon(
              Icons.remove,
            ),
            padding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 18.0),
            color: Theme.of(context).primaryColor,
          ),
          onLongPressStart: (_) async {
            startPressing(() => decrement(10));
          },
          onLongPressCancel: () {
            cancelPress();
          },
          onLongPressEnd: (_) {
            cancelPress();
          },
        ),

 

нормально ли для Flutter иметь GestureDetector «для длительного нажатия» и IconButton «для нажатия»?
Могут ли у меня возникнуть проблемы с какой-либо конкретной версией Android с таким решением?

Комментарии:

1. Когда вы выстрелите onPressed , он тоже выстрелит onLongPressEnd , попробуйте добавить print() , чтобы посмотреть, что произойдет

2. @cahyo все работает нормально. Мой вопрос: «Безопасно ли помещать кнопку «Значок» поверх приглашенного регистра»?

Ответ №1:

Попробуйте InkWell вместо этого, он будет действовать так IconButton и даст вам эффект пульсации

 Material(
  child: InkWell(
    onTap: () {},
    onLongPress: () {},
    child: Ink(
      child: Icon(Icons.add),
    ),
  ),
),
 

Комментарии:

1. спасибо, но у него та же проблема — только значок реагирует на нажатие (или длительное нажатие). Это может быть исправлено, Ink (padding) но другая проблема все еще здесь. GestureDetector позволяет увеличить значение на 10 при длительном нажатии до onLongPressCancel или onLongPressEnd . Однако InkWell( onLongPress стреляет только один раз.

Ответ №2:

установите и установите, вставьте и зафиксируйте размер с помощью width height Container GestureDetector Icon

      Container(
      alignment: Alignment.center,
      width: 40, 
      height: 40,
      child: GestureDetector(
        child: Padding(
         padding: EdgeInsets.symmetric(vertical: 6.0, horizontal: 18.0),
         child: Icon(
          Icons.add,
      ),),
      onTap: () {
        increment(1);
      },
      onLongPressStart: (_) async {
        startPressing(() => increment(10));
      },
      onLongPressCancel: () {
        cancelPress();
      },
      onLongPressEnd: (_) {
        cancelPress();
      },
    ),
   )
 

Комментарии:

1. это работает, если child: Padding( удалено из иерархии элементов управления виджета. С Padding() обоими onTap и onLongPressStart не работает вообще

2. заполнение является дочерним GestureDetector элементом, поэтому оно не может отключить действия родителей

3. возможно, но я попробовал ваш образец рядом с работой IconButton до того, как был написан первый комментарий. GuestureDetector Не работает с Padding ребенком (и работает, когда Padding удаляется)