我使用以下代码:
Widget getSelectSortBy() {
return InkWell(
onHover: (value) {
setState(() {
_isHoveringSortBy = value;
});
},
// onTap needs to be implemented
// otherwise onHover does NOT work! */don't know why/*
onTap: () => {},
child: AnimatedContainer(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(16)),
color: blueSortBy,
border: Border.all(
color: _isHoveringSortBy
? Colors.white
: Colors.transparent,
width: 1.0)),
duration: timeHoveringBottomAnimatedContainer,
padding: EdgeInsets.only(top: 8, bottom: 9, left: 20, right: 28),
child: Row(
// rest of the code of Row
)
);
}我发现需要来为InkWell Widget实现onTap()方法。否则,onHover()方法将无法工作。
现在的问题是,为何要这样做呢?还是我做错了什么?
注意:我在Chrome上测试了这个页面。(我不知道是否有不同的情况。)
发布于 2021-06-16 05:40:32
从交互设计的角度来看,当小部件本身没有任何交互方式(点击、双击或长按压)时,给出视觉反馈是没有意义的。也许这就是原因。
如果您需要覆盖行为(这是好的),一个空的回调似乎可以正常工作。
深度
如果检查Inkwell小部件,您会发现Inkwell小部件只有在这三种部件都可用的情况下才被认为是启用的:onTap、onDoubleTap、onlongPress
// Line 1034
bool _isWidgetEnabled(_InkResponseStateWidget widget) {
return widget.onTap != null || widget.onDoubleTap != null || widget.onLongPress != null;
}
bool get enabled => _isWidgetEnabled(widget);并且,Hover事件只有在启用时才会被处理。
// Line 1040
// MouseEnter /Hover event
// Calls _handleHoverChange() if enabled
void _handleMouseEnter(PointerEnterEvent event) {
_hovering = true;
if (enabled) {
_handleHoverChange();
}
}
// Line 1054
// Calls updateHighLight()
void _handleHoverChange() {
updateHighlight(_HighlightType.hover, value: _hovering);
}如果深入研究,您会发现updateHighlight()是处理onHover回调的那个。
PS。答案很粗糙,但希望你能明白问题所在。
https://stackoverflow.com/questions/67994569
复制相似问题