Wheel ListView 小部件内的颤振按钮

Posted

技术标签:

【中文标题】Wheel ListView 小部件内的颤振按钮【英文标题】:Flutter Button inside a Wheel ListView Widget 【发布时间】:2021-06-10 22:31:35 【问题描述】:

我使用的是ListWheelScrollView,更具体的是clickable。 (clickable_list_wheel_view)

我试图在我的itemWidget 中添加一个button,但我无法单击它。这是我的list

return ClickableListWheelScrollView(
  scrollController: _scrollController,
  itemHeight: _itemHeight,
  itemCount: months.length,
  scrollOnTap: true,
  onItemTapCallback: (index) 
    print(index)
  ,
  child: ListWheelScrollView.useDelegate(
    controller: _scrollController,
    itemExtent: _itemHeight,
    physics: FixedExtentScrollPhysics(),
    diameterRatio: 3,
    squeeze: 0.95,
    onSelectedItemChanged: (index) 
      // print(index);
    ,
    childDelegate: ListWheelChildBuilderDelegate(
      builder: (context, index) => MonthCardWidget(
        month: months[index],
      ),
      childCount: months.length,
    ),
  ),
);

在我的MonthCardWidget 里面我有这个简单的button

          Container(
            height: 45,
            width: 45,
            color: Colors.transparent,
            child: IconButton(
              splashColor: Colors.transparent,
              highlightColor: Colors.transparent,
              onPressed: () 
                print('flip');
              ,
              icon: SvgPicture.asset('assets/images/flip.svg',
                  height: 20, width: 20),
            ),
          ),

一切都显示得很好,但我的button 从未调用过onPressed。我猜GestureDetector 覆盖了按钮?有什么解决方法吗?我在这方面找不到任何东西。

GestureDetector 只是在listView 之上:

@override
  Widget build(BuildContext context) 
    if (_listHeight == .0) 
      return MeasureSize(
        child: Container(
          child: widget.child,
        ),
        onChange: (value) 
          setState(() 
            _listHeight = value.height;
          );
        ,
      );
    

    return GestureDetector(
      onTap: _onTap,
      onTapUp: (tapUpDetails) 
        _tapUpDetails = tapUpDetails?.localPosition;
      ,
      child: widget.child,
    );
  

【问题讨论】:

您在描述中提到了 GestureDetector,但它不在您共享的代码中。 @JoãoSoares 我链接了clickableListWheelView。基本上整个list 都包裹在GestureDetector 中。 但是我们看不到这一点,因为您还没有共享那部分代码。您在 GestureDetector 中设置的选项等。如果您想获得帮助,请分享可能影响您问题的代码。 @JoãoSoares 更新了我的问题,这有帮助吗?就像我说的,那是来自我链接的包。我在那里没有改变任何东西。您可以查看链接,也许这会使事情更清楚 【参考方案1】:

点击永远不会到达您的 GestureDetector,您需要在此处指定 ClickableListWheelScrollView 中的点击:

  onItemTapCallback: (index) 
print(index)

,

如果您的打印没有打印,请使用 ClickableListWheelScrollView 插件发布者。您需要根据从 ClickableListWheelScrollView 传递的索引号,通过按钮实现所需更改的逻辑我认为....所以 setState 函数的映射可能会做到这一点。

认为按钮只是一个视图,您只是根据每个按钮在列表中的位置并行运行功能逻辑。按钮是埋在列表下面的,需要在ListWheel上面加一层,就是Clickable插件,但是很明显它和按钮断开了,所以需要根据索引值来创建逻辑,也就是位置列表中的对象。

我通常做什么:

onSelectedItemChanged: (index) 
  // print(index);
,

    这将返回列表中项目的索引位置。使用它来更改变量。

    将滚动条包裹在 GestureDetector 中。

    在手势检测器中,编写或调用一个函数,该函数采用您的索引位置变量并按照您的需要执行您的函数。

    如果您需要控制滚动在列表位置的起始位置,或者在重建时记住其位置等,请使用带有 initialItem 的 FixedExtentScrollController。

一切都以这种方式从 onSelectedItemChanged 的​​索引中分离出来,并且您使用 FixedExtentScrollController 在构建时设置起始位置。请记住,列表从 0 开始。

【讨论】:

感谢您的回答!我知道这是一个棘手的问题......而且我还没有找到解决方案。我还开了一个问题:github.com/Cilestal/clickable_list_wheel_view/issues/1 我查看了您的帖子,但我并没有完全按照您要执行的操作。我刚做了一些。我没有使用您上面使用的包,而是将 Scroller 包装在手势检测器中……我将编辑我的答案以解释得更清楚一些。

以上是关于Wheel ListView 小部件内的颤振按钮的主要内容,如果未能解决你的问题,请参考以下文章

提取的小部件内的颤振滑块

颤振回调到后退按钮上的原始小部件

滚动小部件内的颤振滚动小部件

在flutter中使用listview.builder添加多个彼此不同的动态小部件

颤振中的 LIstView.builder

在颤振列表视图中检测焦点小部件