Я хочу иметь MaterialButton для обнаружения onTapDown, onTapUp и onTapCancel.
К сожалению, MaterialButtons обнаруживает только onPressed. Поэтому я обернул его GestureDetector, но для MaterialButtons onPressed имеет @required, поэтому я установил его в () {}. Проблема в том, что даже если я сделаю поведение GestureDetector полупрозрачным, если я нажму на кнопку, будет запущен только обратный вызов onPressed для Button, и я потеряю обратные вызовы onTapDown и onTapUp для GestureDetector. Я получаю onTapDown для срабатывания, только если я долго нажимаю кнопку, и когда я ее отпускаю, запускается onTapCancel. Я никогда не смогу запустить onTapUp таким образом.
Мне по-прежнему нужен MaterialButton из-за его возможностей тактильной / звуковой / визуальной обратной связи.
Я попытался вообще не устанавливать onPressed на MaterialButton, и (как ни странно) он все еще работал, но кнопка была отключена и вообще не давала никакой обратной связи.
GestureDetector(
behavior: HitTestBehavior.translucent,
onTapDown: (_) {
th.handleTap(i, 0);
},
onTapUp: (_) {
th.handleTap(i, 1);
},
onTapCancel: () {
th.handleTap(i, 2);
},
child: MaterialButton(
onPressed: () {},
child: Container(
margin: EdgeInsets.all(5),
child: Icon(icon),
),
)
)
Изменить: Спасибо, Хьюго Пассос, по какой-то причине я предположил, что MaterialButtons никогда не будет передавать жест своим детям. Я приближаюсь, но меня все еще нет: единственный способ, который я нашел, чтобы соответствовать размеру жеста, - это «зажать» его между двумя контейнерами, что не кажется мне очень элегантным решением. Кстати, даже в этом случае я сталкиваюсь с двумя проблемами:
1: Если я (довольно легко) нажимаю на границу кнопки, у меня все еще срабатывает onPressed MaterialButton вместо обратных вызовов GestureDetector. Я думал, что у него нулевой размер, поэтому он не мог никогда не постучать. Эта проблема не проявляется, если я установил поведение GestureDetector на непрозрачное (все еще странно для меня).
2: Самое важное: я все еще не могу получить встроенные возможности обратной связи MaterialButton, если случайно не запустил его onPressed.
Container(
margin: EdgeInsets.all(2),
width: buttonSize,
height: buttonSize,
child: RaisedButton(
padding: EdgeInsets.zero,
onPressed: () {print("onTap");},
child: Container(
margin: EdgeInsets.zero,
width: buttonSize,
height: buttonSize,
child: GestureDetector(
onTapDown: (_) {
th.handleTap(i, 0);
},
onTapUp: (_) {
th.handleTap(i, 1);
},
onTapCancel: () {
th.handleTap(i, 2);
},
child: Icon(icon)
),
),
),
);