Как добавить как onPressed, так и onLongPress в виджет Flutter Center внутри строки?

Я тщетно пытаюсь добавить onLongPress к кнопке изображения вместе с onPressed. Я получаю сообщение об ошибке: именованный параметр onDoubleTap не определен.

У меня есть несколько строк из двух горизонтальных кнопок изображения с использованием строк и расширений. Все работает кромеonLongPress (или onDoubleTap). Что я делаю не так, мне нужно перестроить весь код в другом формате, или я слишком усложняю это?

Я также попытался добавить нового ребенка (ошибка: уже определена), GestureDetector, InkWell, безуспешно.

body: SingleChildScrollView(
      child: Container(
        child: Column(
          children: <Widget>[
            Center(
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                  Expanded(
                      child: FlatButton(               
                          onPressed: () {
                            setState(() {
                              launchURL();
                            });
                          },  

                          //Trying to add onLongPress , error: "onLongPress not defined
                          //If I try add a new child it says child already defined

                          onLongPress: () => _showAlertMessage(context, "message"),


                          padding: EdgeInsets.all(6.0),
                          child: Image.asset(
                            'images/image1.png',
                          ))),

                  Expanded(
                      child: FlatButton(                     
                          onPressed: () {
                            setState(() {
                              launchURL();
                            });
                          },
                          padding: EdgeInsets.all(6.0),
                          child: Image.asset(
                            'images/image2.png',
                          )
                      )//flat button
                  ),//expanded
                ])), //row-center

                //Repeat above for rows of 2 more image buttons

Код работает с одним onPressed для каждой кнопки и не отображает никаких ошибок, но добавление любого события второго щелчка отображает ошибки.

4 ответа

Решение

Flatbutton поддерживает только обратный вызов onPressed, но не onLongpressed и т. Д. Предлагаем вам еще раз взглянуть на использование детектора жестов или других виджетов, поддерживающих долгое нажатие. Я бы попробовал использовать два контейнера, каждый из которых заключен в виджет детектора жестов, в качестве дочерних элементов в строке. Каждый контейнер имеет текстовое и / или графическое содержимое. Затем вы можете выбрать onTap, двойное нажатие, долгое нажатие и т. Д. На каждом контейнере. Не тестировал это, так как я использую свой телефон, но должен работать. Вероятно, это более элегантные виджеты, чем контейнер.

Вы можете использовать виджет InkWell

      child: InkWell(
                                onLongPress: () {
                                  setState(() {
                                    tip++;
                                  });
                                },
                                child: FloatingActionButton(
                                  heroTag: "btn+",
                                  onPressed: () {
                                    setState(() {
                                      tip++;
                                    });
                                  },
                                  backgroundColor: Colors.grey.shade400,
                                  child: Icon(
                                    Icons.add,
                                    color: Colors.black,
                                  ),
                                ),
                              ),

Спасибо за отзыв, очень признателен. Я заменил flatButton детектором жестов внутри столбца, использовал onTap вместо onPressed, поместил изображение в новый столбец, добавил onLongPress. Код работает. Когда я добавил второй расширенный, я получил эту ошибку:

E/InputMethodManager( 7133): prepareNavigationBarInfo() rootView is null

Я читал здесь, что "RootView - это представление, в котором размещены все другие представления. Это похоже на корневой узел в древовидной структуре, который является родительским для всех дочерних элементов", но я не вижу здесь своей ошибки. Я выполнил полный перезапуск, и эта ошибка исчезла.

            Container(
            child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
              Expanded(
                child: GestureDetector(
                    onLongPress: () {
                      setState(() {
                        _showAlertMessage(context, "message");
                      });
                    },
                    onTap: () {
                      setState(() {
                        _launchUrl;
                      });
                    },
                    child: Container(
                        padding: EdgeInsets.all(6.0),
                        child: Image.asset(
                          'images/image1.png',
                        ) 
                        )),
              ), //Expanded

              Expanded(
                child: GestureDetector(
                    on: () {
                      setState(() {
                        _showAlertMessage(context, "message");
                      });
                    },
                    onTap: () {
                      setState(() {
                        _launchUrl;
                      });
                    },
                    child: Container(
                        padding: EdgeInsets.all(6.0),
                        child: Image.asset(
                          'images/image2.png',
                        ) 
                        )),
              ), 


            ])), 

ПРИМЕЧАНИЕ: Как версия 2 флаттера FlatButtonустарел. Вы должны использовать TextButton вместо.

Я не знаю, как вы используете, но это лучшее решение, подходящее для вашего вопроса и поддерживающее различные аспекты жестов нажатия пользователем. Поэтому я подготовил приведенный ниже пример кода, чтобы увидеть, как он работает.

              body: SingleChildScrollView(
        child: Container(
            child: Column(children: <Widget>[
  Center(
      child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
        Expanded(
            child: GestureDetector(
              onTap: () => print('onTap'), 
              onLongPress: () => print('onLongPress'), 
              onDoubleTap: () => print('onDoubleTap'), 
              child: Image.network(
              'https://lp-cms-production.imgix.net/image_browser/social-beast-GettyRF_136327669.jpg?auto=format&fit=crop&sharp=10&vib=20&ixlib=react-8.6.4&w=850&q=50&dpr=2'),
            ) //flat button
        ),

        Expanded(
            child: GestureDetector(
              onTap: () => print('onTap'), 
              onLongPress: () => print('onLongPress'), 
              onDoubleTap: () => print('onDoubleTap'), 
              child: Image.network(
              'https://lp-cms-production.imgix.net/image_browser/lions-hunting-500pxRF_7416880.jpg?auto=format&fit=crop&sharp=10&vib=20&ixlib=react-8.6.4&w=850&q=50&dpr=2'),
            )
        ), //expanded
      ])
  ), //row-center
]
            )
        )
    )

Есть еще так много других жестов для GestureDetectorэто можно найти здесь .

Другие вопросы по тегам