GestureDetector не работает поверх TabBarView - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу обнаружить жесты в TabBarView, поэтому я обернул TabBarView в виджет GestureDetector, но он не регистрирует никаких жестов. И пролистывание на разные вкладки работает. Я просто хочу обнаружить жесты.

TabController _tabController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(//I have 3 tabs in here at AppBar.bottum),

///This is where I need help with the GestureDetector not working.

      body: GestureDetector(
        onHorizontalDragStart: (DragStartDetails details) {
          print('Start : ');
          print(details);
        },
        child: TabBarView(controller: _tabController, children: <Widget>[
          Tab(icon: Icon(Icons.category)),
          Tab(icon: Icon(Icons.home)),
          Tab(icon: Icon(Icons.star)),
        ]),
      ),


    );
  }

1 Ответ

0 голосов
/ 15 апреля 2020

Вложенные виджеты жестов

Причина, по которой у вас возникает эта проблема, заключается в том, что оба этих виджета получают сенсорный ввод, а когда у вас есть два виджета, которые получают сенсорный ввод, короткая история о ребенке выигрывает эту битву. Вот длинная история. Таким образом, оба ваших ввода от ваших 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 это отличная статья, я настоятельно рекомендую вам ознакомиться с ней.

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