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

Flutter中如何为timeline widget所在容器添加筛选按钮实现事件过滤

实现方案

你只需要调整原有标题区域的布局结构,把纯文本展示的容器改为左右排列的Row布局即可,具体改动如下:

改动点说明

  • 将原来包裹标题文字的Container的child从单Text改为Row,设置主轴对齐方式为两端对齐,左边放标题文本,右侧放筛选按钮
  • 给筛选按钮绑定点击事件,在事件中实现你的筛选逻辑,筛选完成后调用setState更新_userDetails列表就能自动刷新timeline展示内容

修改后完整代码

Expanded(
  child: Padding(
    padding: EdgeInsets.fromLTRB(7, 0, 7, 7),
    child: Container(
      alignment: Alignment.center,
      decoration: BoxDecoration(
        border: Border.all(width: 1.5),
        borderRadius: BorderRadius.circular(25)
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          // 改动的标题区域
          Container(
            height: 45,
            padding: EdgeInsets.symmetric(horizontal: 15, vertical: 2),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Text(
                  "история событий", 
                  style: TextStyle(fontSize: 25.0, color: Colors.blueGrey)
                ),
                // 新增的筛选按钮,样式可以自己调整
                IconButton(
                  onPressed: () {
                    // 这里写你的筛选逻辑,筛选完成后调用setState更新_userDetails即可
                    // 示例:筛选符合条件的事件
                    // setState(() {
                    //   _userDetails = _userDetails.where((item) => 你的筛选条件).toList();
                    // });
                  },
                  icon: Icon(Icons.filter_alt, color: Colors.blueGrey),
                )
              ],
            ),
          ),
          Expanded(
            child: Scrollbar(
              child: ListView(
                shrinkWrap: true,
                children: [
                  Container(
                    alignment: Alignment.bottomLeft,
                    child: FixedTimeline.tileBuilder(
                      theme: TimelineThemeData(
                        nodePosition: 0.23,
                        color: Colors.blueGrey,
                        indicatorTheme: IndicatorThemeData(
                          position: 2,
                          size: 20.0,
                        ),
                        connectorTheme: ConnectorThemeData(
                          thickness: 2.5,
                        ),
                      ),
                      builder: TimelineTileBuilder.connectedFromStyle(
                        contentsAlign: ContentsAlign.basic,
                        oppositeContentsBuilder: (context, index) => Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Text(_userDetails[index].date),
                        ),
                        contentsBuilder: (context, index) => Card(
                          child: Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(_userDetails[index].event),
                          ),
                        ),
                        connectorStyleBuilder: (context, index) => ConnectorStyle.solidLine,
                        indicatorStyleBuilder: (context, index) => IndicatorStyle.dot,
                        itemCount: _userDetails.length,
                      ),
                    )
                  ),
                ],
              )
            )
          ),
        ],
      )
    )
  )
)

如果你需要按钮是文字样式或者其他自定义样式,把IconButton替换成对应组件即可,比如TextButton、ElevatedButton都可以,只要放在Row的右侧位置就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:06:02