Wheel ListView 小部件内的颤动按钮

时间:2021-03-12 22:05:27

标签: flutter listview dart widget gesturedetector

我使用的是更具体的 ListWheelScrollViewclickable。 (clickable_list_wheel_view)

我试图在我的 button 中添加一个 itemWidget,但我无法点击它。这是我的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),
            ),
          ),

一切都显示得很好,但从未在我的 onPressed 上调用 button。我猜 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,
    );
  }

1 个答案:

答案 0 :(得分:0)

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

  onItemTapCallback: (index) {
print(index)

},

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

把按钮想象成一个视图,你只是根据每个按钮在列表中的位置并行运行函数逻辑。按钮被埋在列表下面,你需要在ListWheel上面一层,也就是Clickable插件,但是很明显它变得和按钮断开了,所以你需要根据index值来创建逻辑来链接它们,也就是位置列表中的对象。

我通常做什么:

onSelectedItemChanged: (index) {
  // print(index);
},
  1. 这将返回列表中项目的索引位置。使用它来更改变量。

  2. 将您的滚动条包裹在 GestureDetector 中。

  3. 在手势检测器中,编写或调用一个函数,该函数接受您的索引位置变量并根据您的需要执行您的功能。

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

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