Flutter开发:如何通过长按手势触发ListView中Slidable组件的侧滑动作
你可以通过获取Slidable组件的状态实例调用侧滑方法实现需求,修改方案如下:
核心改动点
- 将原无状态
BookmarkListTile改为有状态组件,用于持有Slidable的状态引用 - 给
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
相关产品推荐
相关产品推荐

