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

Flutter中如何调整TableCalendar日历头部高度?

如何缩小TableCalendar日历头部的蓝色区域高度?

你遇到的问题是TableCalendar的头部蓝色区域默认高度过高,想要调整缩小它,尝试过多种方法但因为包没有直接的高度属性未奏效。

日历头部蓝色区域过高的效果

你的现有代码:

Container(
  decoration: const BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.only(
          bottomLeft: Radius.circular(20),
          bottomRight: Radius.circular(20),
          topLeft: Radius.circular(40),
          topRight: Radius.circular(40))),
  
  child: TableCalendar(
    daysOfWeekStyle: const DaysOfWeekStyle(
        decoration: BoxDecoration(color: Colors.white)),
    daysOfWeekHeight: 20,

    calendarFormat: CalendarFormat.week,
    weekendDays: const [DateTime.sunday],
    calendarStyle: CalendarStyle(
        todayDecoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
            gradient: const LinearGradient(
                colors: [Color(0xFF20264B), Color(0xFF213BCE)],
                begin: Alignment.centerLeft,
                end: Alignment.centerRight)),
        rowDecoration: const BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.only(
                bottomLeft: Radius.circular(20),
                bottomRight: Radius.circular(20))),
        weekendTextStyle: const TextStyle(color: Colors.red)),
    headerStyle: HeaderStyle(
      headerMargin: EdgeInsets.only(bottom: 10),
        titleTextStyle: const TextStyle(color: Colors.white, fontSize: 20),
        decoration: BoxDecoration(
          shape: BoxShape.rectangle,
            borderRadius: BorderRadius.circular(50),
            gradient: const LinearGradient(
                colors: [Color(0xFF20264B), Color(0xFF213BCE)],
                begin: Alignment.centerLeft,
                end: Alignment.centerRight)),
        formatButtonVisible: false,
        titleCentered: true,
    ),
    firstDay: DateTime.utc(2010, 10, 16),
    lastDay: DateTime.utc(2030, 3, 14),
    focusedDay: DateTime.now(),
  ),
);

解决方案

因为TableCalendar的HeaderStyle没有提供直接设置高度的属性,可以通过以下几种变通方法实现:

  • 压缩头部内边距+缩小文字
    在HeaderStyle中调整contentPadding来减少上下空白,同时缩小标题字号,直接压缩头部高度:

    headerStyle: HeaderStyle(
      headerMargin: EdgeInsets.only(bottom: 10),
      titleTextStyle: const TextStyle(color: Colors.white, fontSize: 16), // 缩小标题字号
      contentPadding: EdgeInsets.symmetric(vertical: 8), // 压缩上下内边距
      decoration: BoxDecoration(
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.circular(50),
        gradient: const LinearGradient(
          colors: [Color(0xFF20264B), Color(0xFF213BCE)],
          begin: Alignment.centerLeft,
          end: Alignment.centerRight)),
      formatButtonVisible: false,
      titleCentered: true,
    ),
    
  • 完全自定义头部
    隐藏默认头部,自己用Container实现一个固定高度的头部,自由度更高:

    Container(
      decoration: const BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
              bottomLeft: Radius.circular(20),
              bottomRight: Radius.circular(20),
              topLeft: Radius.circular(40),
              topRight: Radius.circular(40))),
      child: Column(
        children: [
          // 自定义固定高度的头部
          Container(
            height: 40, // 直接设置你想要的高度
            margin: EdgeInsets.only(bottom: 10),
            decoration: const BoxDecoration(
              borderRadius: BorderRadius.circular(50),
              gradient: LinearGradient(
                colors: [Color(0xFF20264B), Color(0xFF213BCE)],
                begin: Alignment.centerLeft,
                end: Alignment.centerRight)),
            child: Center(
              child: Text(
                "${DateFormat.yMMMM().format(DateTime.now())}",
                style: const TextStyle(color: Colors.white, fontSize: 16),
              ),
            ),
          ),
          // 日历主体,隐藏默认头部
          TableCalendar(
            headerStyle: HeaderStyle(headerVisible: false),
            daysOfWeekStyle: const DaysOfWeekStyle(
                decoration: BoxDecoration(color: Colors.white)),
            daysOfWeekHeight: 20,
            calendarFormat: CalendarFormat.week,
            weekendDays: const [DateTime.sunday],
            calendarStyle: CalendarStyle(
                todayDecoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(20),
                    gradient: const LinearGradient(
                        colors: [Color(0xFF20264B), Color(0xFF213BCE)],
                        begin: Alignment.centerLeft,
                        end: Alignment.centerRight)),
                rowDecoration: const BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.only(
                        bottomLeft: Radius.circular(20),
                        bottomRight: Radius.circular(20))),
                weekendTextStyle: const TextStyle(color: Colors.red)),
            firstDay: DateTime.utc(2010, 10, 16),
            lastDay: DateTime.utc(2030, 3, 14),
            focusedDay: DateTime.now(),
          ),
        ],
      ),
    );
    

    注意:使用自定义头部时需要导入intl包来处理日期格式化(import 'package:intl/intl.dart';)。

  • 调整头部间距
    如果不需要自定义头部,也可以尝试减少headerMargin的值,或者如果显示左右箭头的话,调整leftChevronMargin和rightChevronMargin来减少额外空白。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:35:28