flutter: кнопка onTap, доступная для прослушивания, не работает с позицией в стеке

#flutter #flutter-layout

#трепетание #flutter-layout

Вопрос:

Я пытаюсь создать пользовательский диалог. В диалоговом окне кнопка закрытия находится над контейнером:

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

Теперь я пытаюсь закрыть диалоговое окно, когда пользователь нажал на этот значок закрытия:

   Widget build(BuildContext context) {
    return Dialog(
      insetPadding: EdgeInsets.symmetric(vertical: 0.0, horizontal: 30.0),
      child: Container(
        width: 300,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Stack(
              overflow: Overflow.visible,
              children: [
                Visibility(
                  visible: true,
                  child: Positioned(
                    top: -15,
                    left: 0,
                    child: GestureDetector(
                        onTap: () {
                          print("Clicked");
                        },
                        child: CircleWidget()),
                  ),
                ),
                SingleChildScrollView(
                  child: Column(
 

Но onTap не срабатывает! Я думаю, что она лежит под каким-то виджетом!!!

Если GestureDetector является родительским Positioned элементом для формы виджета, это неправильно.вот так:

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

Хотя onTap не работает, как указано выше.В чем ваша идея?

Ответ №1:

попробуйте использовать InkWell вместо GestureDetector

 child: InkWell(onTap: () {
       print("Clicked");
},
child: CircleWidget()),
 

Комментарии:

1. Я пытался, но не работал, как GestureDetector @milanpithadia

Ответ №2:

Как я предполагал ранее, виджет закрывал GestureDetector, поэтому я изменил позицию этого кода :

 Visibility(
  visible: widget.showCloseButton(),
  child: Positioned(
    top: -15,
    left: 0,
 

с :

 SingleChildScrollView(
  child: Column(
    mainAxisSize: MainAxisSize.min,
 

Теперь GestureDetector работает как шарм 🙂

полный код:

   Widget build(BuildContext context) {
    return Dialog(
      insetPadding: EdgeInsets.symmetric(vertical: 0.0, horizontal: 30.0),
      child: Container(
        width: 300,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Stack(
              overflow: Overflow.visible,
              children: [
                SingleChildScrollView(
                  child: Column(.....

                Visibility(
                  visible: true,
                  child: Positioned(
                    top: -15,
                    left: 0,
                    child: GestureDetector(
                        onTap: () {
                          print("Clicked");
                        },
                        child: CircleWidget()),
                  ),
                ),