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

Flutter:如何让ExpansionPanelList拥有指定Container的装饰样式

实现ExpansionPanelList.radio的自定义装饰效果

你需要把整个ExpansionPanelList.radio包裹在带自定义装饰的Container中——因为ExpansionPanel系列组件本身没有直接设置decoration的属性,直接套Container是最简洁有效的方式。

注意要调整原Container的固定宽高为自适应(ExpansionPanel需要展开,固定尺寸不适用),同时给面板的头部和内容添加内边距,避免内容贴到圆角边缘影响视觉效果。

修改后的完整代码示例:

Container(
  width: double.infinity, // 自适应父容器宽度,可根据需求调整
  margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), // 可选,避免面板贴屏幕边缘
  decoration: const BoxDecoration(
    color: Colors.grey,
    borderRadius: BorderRadius.all(Radius.circular(30)),
    boxShadow: [
      BoxShadow(
        color: Colors.black,
        offset: Offset(0.0, 0.0),
        blurRadius: 14.0,
        spreadRadius: -15,
      ),
    ],
  ),
  child: ExpansionPanelList.radio(
    // 必须实现展开/收起的回调逻辑,更新状态
    expansionCallback: (int index, bool isExpanded) {
      setState(() {
        // 示例:假设你的task对象有isExpanded字段,更新它的状态
        // taskList[index].isExpanded = !isExpanded;
      });
    },
    children: taskList
        .map((task) => ExpansionPanelRadio(
              value: task,
              headerBuilder: (context, isOpen) => Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16),
                child: TaskTile(task: task, taskList: taskList),
              ),
              body: const Padding(
                padding: EdgeInsets.symmetric(horizontal: 20, vertical: 16),
                child: Text('ss'),
              ),
            ))
        .toList(),
  ),
);

补充说明

如果想让每个单独的ExpansionPanelRadio都拥有独立的装饰,需要给每个面板的header和body分别套Container,还要处理展开时的圆角衔接(比如展开时头部下圆角隐藏、内容上圆角隐藏),这种方式逻辑更繁琐,所以优先推荐整体包裹的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:55:23