flutter_slidable实现列表仅单项目滑开,设置key未生效如何解决?
flutter_slidable ^0.6.0 单列表项滑动展开实现方案
问题根源
你当前代码的核心问题是所有列表项的Slidable组件共用了同一个全局控制器,且没有开启官方的自动关闭逻辑,单独设置Key仅用作组件标识,无法主动触发其余项的关闭操作。
解决步骤
- 使用官方内置的
SlidableAutoCloseBehavior组件包裹你的ListView,该组件会自动管理同层级下所有Slidable的展开状态,原生支持同一时间仅单个项处于展开状态,无需额外手写逻辑 - 删除所有
Slidable的controller: slidableController配置,共用控制器会导致滑动状态联动异常,使用SlidableAutoCloseBehavior无需手动绑定控制器 - 可选优化:在滑动操作按钮的
onTap回调中调用Slidable.of(context)?.close(),主动关闭当前展开项,避免操作完成后项还保持展开状态
修改后代码示例
return SlidableAutoCloseBehavior( child: ListView.builder( physics: ClampingScrollPhysics(), itemCount: snapshot.data!.size, shrinkWrap: true, itemBuilder: (BuildContext context, count) { final docId = snapshot.data!.docs[count].id; return Padding( padding: const EdgeInsets.all(8.0), child: Slidable( key: Key(docId), actionPane: SlidableDrawerActionPane(), actionExtentRatio: 0.25, actions: <Widget>[ widget.pin == 0 ? IconSlideAction( caption: 'pin 제거', color: Colors.black45, icon: Icons.push_pin_rounded, onTap: () { pinEraseRoom(widget.roomId); Slidable.of(context)?.close(); }, ) : IconSlideAction( caption: 'Pin', color: Colors.black45, icon: Icons.push_pin_outlined, onTap: () { pinRoom(widget.roomId); Slidable.of(context)?.close(); }, ), ], secondaryActions: <Widget>[ IconSlideAction( caption: 'Delete', color: Colors.red, icon: Icons.delete, onTap: () { deleteRoom(widget.roomId); Slidable.of(context)?.close(); }, ), ], // 补充你原有代码中Slidable的剩余配置即可 ), ); }, ), );
补充说明
如果你不想用官方封装的自动关闭组件,也可以手动维护当前展开项的ID:在State中定义String? activeId变量,监听每个Slidable的展开状态,展开时更新activeId为当前项的ID,其余所有项判断自身ID不等于activeId时主动调用close方法关闭,该方案复杂度更高,优先推荐使用SlidableAutoCloseBehavior方案,且该方案完全兼容你当前使用的0.6.0版本,无需升级依赖。
内容的提问来源于stack exchange,提问作者double leem
相关产品推荐
相关产品推荐

