You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter开发:如何通过长按手势触发ListView中Slidable组件的侧滑动作

你可以通过获取Slidable组件的状态实例调用侧滑方法实现需求,修改方案如下:
侧滑效果示意图


核心改动点

  1. 将原无状态BookmarkListTile改为有状态组件,用于持有Slidable的状态引用
  2. 给Slidable绑定全局Key,在长按抬起回调中调用侧滑展开方法即可

修改后完整代码:

import 'package:flutter_slidable/flutter_slidable.dart';

class BookmarkListTile extends StatefulWidget {
  const BookmarkListTile(
      {Key? key, required this.bookmark, this.onTap, this.onDelete})
      : super(key: key);
  final Bookmark bookmark;
  final Function(Bookmark bookmark)? onDelete;
  final Function(Bookmark bookmark)? onTap;

  @override
  State<BookmarkListTile> createState() => _BookmarkListTileState();
}

class _BookmarkListTileState extends State<BookmarkListTile> {
  // 定义Slidable的状态Key
  final GlobalKey<SlidableState> _slidableKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        behavior: HitTestBehavior.translucent,
        onLongPressUp: () {
          print("longpress");
          // 触发右侧侧滑菜单展开,根据你使用的flutter_slidable版本二选一
          // flutter_slidable 1.x版本用这个:
          // _slidableKey.currentState?.open(ActionSide.secondary);
          // flutter_slidable 2.x/3.x版本用这个:
          _slidableKey.currentState?.openEndActionPane();
        },
        child: Slidable(
          // 绑定Key
          key: _slidableKey,
          actionPane: const SlidableDrawerActionPane(),
          secondaryActions: [
            IconSlideAction(
              icon: Icons.delete,
              color: Colors.red,
              onTap: () {
                if (widget.onDelete != null) widget.onDelete!(widget.bookmark);
              },
            )
          ],
          child: ListTile(
            onTap: () {
              if (widget.onTap != null) widget.onTap!(widget.bookmark);
            },
            title: Text(widget.bookmark.note),
            subtitle: Text(PaliScript.getScriptOf(
                language:
                    context.read<ScriptLanguageProvider>().currentLanguage,
                romanText: widget.bookmark.bookName!)),
            trailing: SizedBox(
              width: 100,
              child: Row(
                children: [
                  Text('${AppLocalizations.of(context)!.page} -'),
                  Expanded(
                      child: Text(
                    '${widget.bookmark.pageNumber}',
                    textAlign: TextAlign.end,
                  )),
                ],
              ),
            ),
          ),
        ));
  }
}

简化方案(不需要侧滑动画直接触发删除)

如果不需要展示侧滑动画,希望长按直接执行删除逻辑,可以不用改组件状态,直接在长按回调调用删除方法即可:

onLongPressUp: () {
  if (onDelete != null) onDelete!(bookmark);
},

内容的提问来源于stack exchange,提问作者Bhikkhu Subhuti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:57:02