如何在SingleChildScrollView子项中正确使用IgnorePointer组件?
问题:SingleChildScrollView中IgnorePointer组件无效
我在SingleChildScrollView的子项中使用了IgnorePointer组件,但指针忽略功能完全没生效,组件相当于没用。但把它用在Container上时却能正常工作,相关代码如下:
@override Widget build(BuildContext context) { return SizedBox( width: constraints.maxWidth, height: constraints.maxHeight, child: Stack( children: [ Positioned( right: 0, child: SizedBox( width: 250, height: constraints.maxHeight, child: SingleChildScrollView( child: Column( children: [ for (int i = 0; i < 25; i++) ...[ Container( width: double.infinity, height: 65, padding: const EdgeInsets.all(16.0), margin: const EdgeInsets.all(8.0), color: Colors.white, child: Center( child: Text( (i + 1).toString(), style: const TextStyle( color: Colors.black, fontSize: 22, ), ), ), ), const IgnorePointer(child: SizedBox(height: 4.0)),
这个组件完全不起作用。通常我把它用在Container上时是能正常运行的。
], ), ), ), ), ) ], ), ); }
原因及解决办法
- 问题根源:你把IgnorePointer套在了
SizedBox(height:4.0)上,而这个空的SizedBox本身就不响应任何指针事件(既没有点击、触摸逻辑,也不会触发滚动相关的指针交互),所以IgnorePointer的存在不会产生任何可见效果。之前用在Container上生效,是因为那个Container本身是可交互的(比如带有点击事件,或者会响应触摸)。 - 正确用法:如果需要阻止某个可交互组件接收指针事件,要把IgnorePointer直接套在该组件外层。比如给带点击事件的Container套IgnorePointer:
// 示例:阻止可交互Container接收指针事件 IgnorePointer( child: GestureDetector( onTap: () => print('不会触发这个打印'), child: Container( width: double.infinity, height: 65, padding: const EdgeInsets.all(16.0), margin: const EdgeInsets.all(8.0), color: Colors.white, child: Center(child: Text('无法点击')), ), ), )
- 额外说明:如果你的需求只是给列表项之间加间隔,直接用
SizedBox(height:4.0)就行,完全不需要套IgnorePointer——因为这个间隔本身就不会干扰任何指针交互。
内容的提问来源于stack exchange,提问作者SansinaApp
相关产品推荐
相关产品推荐

