#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
удаляется)