Как добавить как 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
это можно найти здесь .