Вложенные виджеты жестов
Причина, по которой у вас возникает эта проблема, заключается в том, что оба этих виджета получают сенсорный ввод, а когда у вас есть два виджета, которые получают сенсорный ввод, короткая история о ребенке выигрывает эту битву. Вот длинная история. Таким образом, оба ваших ввода от ваших TabBarView
и GestureDetector
отправляются на то, что называется GestureArena
. Здесь арена учитывает множество различных факторов, но в конце истории ребенок всегда побеждает. Вы можете решить эту проблему, определив свой собственный RawGestureDetector
с его собственным GestureFactory
, который изменит способ работы арены.
RawGestureDetector(
gestures: {
AllowMultipleGestureRecognizer: GestureRecognizerFactoryWithHandlers<
AllowMultipleGestureRecognizer>(
() => AllowMultipleGestureRecognizer(),
(AllowMultipleGestureRecognizer instance) {
instance.onTap = () => print('Episode 4 is best! (parent container) ');
},
)
},
behavior: HitTestBehavior.opaque,
//Parent Container
child: Container(
color: Colors.blueAccent,
child: Center(
//Wraps the second container in RawGestureDetector
child: RawGestureDetector(
gestures: {
AllowMultipleGestureRecognizer:
GestureRecognizerFactoryWithHandlers<
AllowMultipleGestureRecognizer>(
() => AllowMultipleGestureRecognizer(), //constructor
(AllowMultipleGestureRecognizer instance) { //initializer
instance.onTap = () => print('Episode 8 is best! (nested container)');
},
)
},
//Creates the nested container within the first.
child: Container(
color: Colors.yellowAccent,
width: 300.0,
height: 400.0,
),
),
),
),
);
class AllowMultipleGestureRecognizer extends TapGestureRecognizer {
@override
void rejectGesture(int pointer) {
acceptGesture(pointer);
}
}
Я хочу отдать должное Na sh, автору Flutter Deep Dive: Gestures это отличная статья, я настоятельно рекомендую вам ознакомиться с ней.