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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:06:05