Как узнать, постучали ли ребенка, даже если он был на кнопке?

Я хотел бы создать Widget, который может определять, когда пользователь нажимает на него. Для этого я использовал GestureGetector с функцией onTap для его обнаружения. Однако, если дочерний элемент содержит кнопку, обратный вызов onTap никогда не вызывается.

Вот пример:

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: MyWidget(
        child: UnkownWidget(),
      ),
    ),
  );
}

class MyWidget extends StatelessWidget {
  const MyWidget({
    @required this.child,
  });

  final Widget child;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GestureDetector(
        behavior: HitTestBehavior.translucent,
        onTap: () {
          print('tapped');
        },
        child: Container(
          width: 200.0,
          height: 200.0,
          color: Colors.blue,
          child: child,
          alignment: Alignment.center,
        ),
      ),
    );
  }
}

class UnkownWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 150.0,
      height: 150.0,
      color: Colors.red,
      child: TextButton(
        child: Text('Button'),
        onPressed: () {
          print('Button pressed');
        },
      ),
    );
  }
}

введите описание изображения здесь

Когда я нажимаю на синий Container, я вижу tapped в консоли, но когда я нажимаю на красный, я вижу только Button pressed (а не tapped), но я бы хотел, чтобы запускались оба обратных вызова.

Я пробовал с HitTestBehavior.deferToChild / HitTestBehavior.translucent / HitTestBehavior.opaque, но ничего не изменилось.


Я также должен указать, что у меня нет никакого контроля над UnkownWidget, поскольку это может быть что угодно, и я все еще хочу, чтобы UnkownWidget вел себя должным образом (по-прежнему запускался нажатием на его кнопки).


Как я могу этого добиться?


person Valentin Vignal    schedule 24.02.2021    source источник


Ответы (1)


Не думаю, что во Flutter можно сделать что-то подобное.

Но, к счастью, я нашел обходной путь для этого. Итак, что вы можете сделать, это вызвать функцию onTap синего контейнера внутри функции onTap красного контейнера. Это будет имитировать эффект касания обоих контейнеров, когда на самом деле касался только красный:

Следуйте этому вопросу, чтобы получить код решения для того же:

Как программно имитировать onTap на кнопке в Флаттер?

person Sarvesh Dalvi    schedule 24.02.2021
comment
Спасибо, но, как я описал, у меня нет контроля над UnkownWidget, которым может быть что угодно, поэтому я не могу изменить его, чтобы вызвать onTap функцию синего Container из красного ... - person Valentin Vignal; 24.02.2021