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

Flutter中点击Card触发Slidable展开的实现问题求助

解决方案

问题根源

你用Slidable.of(context)返回null,核心原因是CustomCard的context和Slidable不在同一个上下文层级——CustomCard是Slidable的子组件,它的context属于自身组件树,无法向上找到Slidable实例。

修复方案1:用Builder包裹CustomCard,修正上下文

把CustomCard用Builder组件包起来,这样onTap里的context是Builder的,能正确关联到上层的Slidable:

Slidable(
  endActionPane: ActionPane(motion: const DrawerMotion(), children: [
    Expanded(
        child: Container(
            decoration: BoxDecoration(
                borderRadius: BorderRadius.only(
                    topRight: smallCircularRadius,
                    bottomRight: smallCircularRadius),
                gradient: customColors.progressBarGradient),
            child: ContactOptions(
                contact: data.getContact(), email: data.email)))
  ]),
  // 用Builder包裹CustomCard,获取正确的上下文
  child: Builder(
    builder: (context) {
      return CustomCard(
          onTap: () {
            // 这里的context是Builder的,能找到Slidable
            Slidable.of(context)?.openEndActionPane();
          },
          child: ListTile(
              dense: true,
              leading: Icon(Icons.supervised_user_circle, size: 50),
              title: Text('KOO KIAN KEAT'),
              subtitle: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text('----', style: customTextStyles.bodySmall)
                  ])));
    },
  ),
)

修复方案2:正确使用SlidableController(推荐)

之前用SlidableController返回null,大概率是初始化或绑定方式错误。正确步骤如下:

  1. 在State类中初始化并销毁控制器:
late final SlidableController _slidableController;

@override
void initState() {
  super.initState();
  _slidableController = SlidableController(context: context);
}

@override
void dispose() {
  _slidableController.dispose();
  super.dispose();
}
  1. 绑定控制器到Slidable,在点击事件中调用:
Slidable(
  // 绑定控制器
  controller: _slidableController,
  endActionPane: ActionPane(motion: const DrawerMotion(), children: [
    Expanded(
        child: Container(
            decoration: BoxDecoration(
                borderRadius: BorderRadius.only(
                    topRight: smallCircularRadius,
                    bottomRight: smallCircularRadius),
                gradient: customColors.progressBarGradient),
            child: ContactOptions(
                contact: data.getContact(), email: data.email)))
  ]),
  child: CustomCard(
      onTap: () {
        // 直接用控制器打开侧滑面板
        _slidableController.openEndActionPane();
      },
      child: ListTile(
          dense: true,
          leading: Icon(Icons.supervised_user_circle, size: 50),
          title: Text('KOO KIAN KEAT'),
          subtitle: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text('----', style: customTextStyles.bodySmall)
              ]))),
)

补充说明

groupTag属性是用来批量控制多个Slidable(比如同时关闭同组的所有侧滑面板),和单个Slidable的点击展开无关,所以之前用它无效是正常的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:08:20