InkWell не показывает эффект пульсации
Нажатие на контейнер запускает обработчик onTap()
но не показывает никакого эффекта всплеска чернил.
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: new InkWell(
onTap: (){print("tapped");},
child: new Container(
width: 100.0,
height: 100.0,
color: Colors.orange,
),
),
),
);
}
}
Я попытался положить InkWell
внутри Container
но тщетно.
Ответы
Ответ 1
Я думаю, что добавление цвета к контейнеру перекрывает эффект чернил
https://docs.flutter.io/flutter/material/InkWell/InkWell.html
Кажется, этот код работает
body: new Center(
child: new Container(
child: new Material(
child: new InkWell(
onTap: (){print("tapped");},
child: new Container(
width: 100.0,
height: 100.0,
),
),
color: Colors.transparent,
),
color: Colors.orange,
),
),
просто нажмите на средний квадрат.
Изменение: я нашел отчет об ошибке. https://github.com/flutter/flutter/issues/3782
Это на самом деле так, как и ожидалось, хотя мы должны обновить документы, чтобы сделать их более понятными.
Что происходит, так это то, что спецификация Материала говорит, что брызги - это фактически чернила на Материале. Поэтому, когда мы выплескиваем, мы буквально заставляем виджет Материал делать всплеск. Если у вас есть что-то поверх Материала, мы попадаем под него, и вы не можете видеть это.
Я хотел добавить виджет "MaterialImage", который также концептуально печатает свое изображение в материале, так что тогда брызги будут над изображением. У нас может быть MaterialDecoration, который делает нечто похожее на украшение. Или мы могли бы сделать материал сам по себе украшение. Прямо сейчас это берет цвет, но мы могли бы расширить это, чтобы взять целое художественное оформление. Пока не ясно, действительно ли совместим материал со спецификацией, чтобы иметь материал с градиентом, поэтому я не уверен, должны ли мы это делать.
В краткосрочной перспективе, если вам просто нужен обходной путь, вы можете поместить материал поверх контейнера с материалом, настроенным на использование типа "прозрачность", а затем поместить в него чернила.
--hixie
Ответ 2
Выход:
![enter image description here]()
Шаг 1. Используйте Material
в качестве родителя для вашего InkWell
, иначе он не будет показывать волновые эффекты.
Шаг 2. Дайте color
виджету Material
, это будет цвет, который вы использовали в вашем Container
.
Шаг 3. Не забудьте использовать onTap()
, даже если вам не с чем обращаться.
Простой пример:
Widget myWidget() {
return Material( // needed
color: Colors.blue,
child: InkWell(
onTap: () {}, // needed
child: Container(width: 200.0, height: 200.0),
),
);
}
Ответ 3
InkWell() никогда не покажет эффект пульсации, пока вы не добавите
onTap : () {}
параметр внутри InkWell, когда он начинает прослушивать ваши краны только при указании этого параметра.
Ответ 4
Я столкнулся с этой же проблемой, пытаясь создать чередующийся цвет InkWell в ListView. В этом конкретном случае есть простое решение: обернуть альтернативы в контейнере, который использует в основном прозрачное изменение оттенка/яркости - анимация касания InkWell по-прежнему будет видна под ней. Нет необходимости в материале. Заметьте, что есть другие проблемы при попытке обойти это с помощью Materal - например, он переопределит DefaultTextStyle, который вы используете по умолчанию (он устанавливает AnimatedDefaultTextStyle), что является огромной болью.
Ответ 5
Лучше использовать виджет " Ink
вместо любого другого виджета.
Вместо определения color
внутри контейнера вы можете определить его в самом виджете Ink
.
Ниже код будет работать.
Ink(
color: Colors.orange,
child: InkWell(
child: Container(
width: 100,
height: 100,
),
onTap: () {},
),
)
Ответ 6
1. The InkWell widget must have a Material widget as an ancestor otherwise
it can't show effects.
e.g -> Material(
child : InkWell(
child : .....
2.you have to add "onTap" method to see the actual effects as like
Buttons {RaisedButton,FlatButton etc}.
e.g -> Material(
child : InkWell(
onTap : (){}
child : .....
let come to the main points see some examples below and try to understand
the actual concepts of InkWell
1. In Below example Material is parent of InkWell with onTap but it still
not working.
Please try to understand the concept of it.
you should provide some margin to container or other widget to show the
effects .
Actually below code working fine but we can't see because we did not
provide any margin or align so it has no space to show the effects.
Widget build(BuildContext context) {
return Center(
child: Material(
child: new InkWell(
onTap: () {
print("tapped");
},
child: new Container(
width: 100.0,
height: 100.0,
color: Colors.orange,
),
),
),
);
}
2. Below example show InkWell effects only to upwards because we provide
space {margin}.
Widget build(BuildContext context) {
return Center(
child: Material(
child: new InkWell(
onTap: () {
print("tapped");
},
child: new Container(
margin: EdgeInsets.only(top: 100.0),
width: 100.0,
height: 100.0,
color: Colors.orange,
),
),
),
);
}
3. Below exp. show the effects in all the page because
center create margin from all the side . Centre align it child
widget from top, left,right and bottom.
Widget build(BuildContext context) {
return Center(
child: Material(
child: new InkWell(
onTap: () {
print("tapped");
},
child: Center(
child: new Container(
width: 100.0,
height: 100.0,
color: Colors.orange,
),
),
),
),
);
}
Happy Coding ...
Ответ 7
Вы можете достичь волнового эффекта, добавив OnTap.
onTap: (){print("clicked");}