堆栈中 ListView 顶部的 GestureDetector 阻止滚动 - Flutter Web

Posted

技术标签:

【中文标题】堆栈中 ListView 顶部的 GestureDetector 阻止滚动 - Flutter Web【英文标题】:GestureDetector on top of a ListView in a Stack blocks the scroll - Flutter Web 【发布时间】:2021-10-18 16:04:35 【问题描述】:

我有一个堆栈,其中首先包含一个 ListView,然后是一个带有 GestureDetector 的透明小部件以单击它。一切正常,但是当我将鼠标放在 GestureDetector 内时,我无法再滚动 ListView,即使将 GestureDetector 的 behavior 属性设置为 HitTestBehavior.translucent

我知道这是因为 GestureDetector 正在吸收它,可能是作为拖动事件,但我希望它只检测点击事件并让滚动事件“通过”。如何在 Flutter 中实现这种行为?

请注意,它仅在使用触控板滚动时发生(我猜是滚轮),但如果您使用拖放手势滚动列表,那么即使您的鼠标悬停在顶部小部件上,滚动也不会停止。

我已经制作了一个 DartPad,所以你可以通过这个链接自己测试它:https://dartpad.dev/8d68891da69d661a8129d5adc7727e4c

代码也贴在下面:

import 'package:flutter/material.dart';

void main() 
  runApp(
    MaterialApp(
      home: ***Example()
    ));


class ***Example extends StatelessWidget 
  Widget _buildListItem() 
    return Container(
      margin: const EdgeInsets.symmetric(vertical: 10),
      height: 100,
      color: Colors.blue[100],
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Stack(
        children: [
          ListView.builder(
            itemCount: 20,
            itemBuilder: (_, __) => _buildListItem(),
          ),
          Center(
            child: GestureDetector(
              behavior: HitTestBehavior.translucent,
              onTap: () => print('tap'),
              child: const Text(
                'Hover me and\ntry to scroll\nthe listview',
                style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold),
              ),
            ),
          ),
        ],
      ),
    );
  

【问题讨论】:

【参考方案1】:

问题不在于 GestureDetector。实际上,Text 小部件是阻止 ListView 接收指针事件的部件。不过,您可以使用IgnorePointer 轻松修复它。

IgnorePointer

在命中测试期间不可见的小部件。

这将使 Text 小部件忽略指针事件并让 ListView 接收它们:

GestureDetector(
  behavior: HitTestBehavior.translucent,
  onTap: () => print('tap'),
  child: IgnorePointer( // You insert it right here above the Text widget
    child: const Text(
      'Hover me and\ntry to scroll\nthe listview',
      style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold),
    ),
  ),
)

【讨论】:

以上是关于堆栈中 ListView 顶部的 GestureDetector 阻止滚动 - Flutter Web的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中添加 ListView.builder 的填充顶部?

滚动ListViewItem位于ListView的顶部

在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距

Android - 问题解决之ScrollView嵌套ListView时总是自动滑动到ListView顶部的问题

在顶部添加新项目时在 ListView 中保持滚动位置

更改 ListView 中当前顶部可见项的颜色 - Flutter