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

Flutter中硬编码宽度仍导致组件宽度不一致问题

Fixing Inconsistent Widths for Labels & Input Fields in Flutter Form

Hey there! I see you're having trouble with your Flutter form where fixed-width labels and input fields aren't aligning correctly across devices. Let's break down why this happens and how to fix it.

Why Fixed Widths Aren't Working

When you set hardcoded fixed widths (like width: 150 or width: 240), they don't account for:

  • Different screen sizes and resolutions (e.g., phones vs. tablets)
  • Device pixel ratios (Flutter uses logical pixels, but physical display density varies)
  • Unintended layout constraints from nested Row widgets that can push elements out of alignment

Step-by-Step Solution

Instead of fixed widths, use responsive layout techniques that adapt to the screen size. Here's how to refactor your code:

1. Use Expanded with Flex Ratios

Replace fixed-width containers with Expanded widgets that use flex values to distribute space proportionally. This ensures your labels and input fields stay aligned no matter the screen size.

2. Clean Up Nested Rows

Remove unnecessary nested Row widgets that add extra constraints, and ensure consistent padding across all form elements.

Refactored Code Example

child: Column(
  children: [
    // Header Section
    Padding(
      padding: const EdgeInsets.fromLTRB(16, 8, 0, 20),
      child: Text(
        "Purchase Order : Other Details",
        textAlign: TextAlign.start,
        style: TextStyle(
          color: Colors.black,
          fontSize: 22,
          fontFamily: 'Lato',
          fontWeight: FontWeight.bold,
        ),
      ),
    ),

    // Gate In/Out Date Row
    Padding(
      padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
      child: Row(
        children: [
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'GATE IN DATE',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Card(
              elevation: 5,
              borderOnForeground: true,
              color: Colors.white,
              child: TextFormField(
                style: TextStyle(color: Colors.black87),
                decoration: InputDecoration(
                  border: InputBorder.none,
                  contentPadding: EdgeInsets.symmetric(horizontal: 16),
                ),
              ),
            ),
          ),
          SizedBox(width: 16),
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'GATE OUT DATE',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Card(
              elevation: 5,
              borderOnForeground: true,
              color: Colors.white,
              child: TextFormField(
                style: TextStyle(color: Colors.black87),
                decoration: InputDecoration(
                  border: InputBorder.none,
                  contentPadding: EdgeInsets.symmetric(horizontal: 16),
                ),
              ),
            ),
          ),
        ],
      ),
    ),

    // Gate In/Out Time Row
    Padding(
      padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
      child: Row(
        children: [
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'GATE IN TIME',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Card(
              elevation: 5,
              borderOnForeground: true,
              color: Colors.white,
              child: TextFormField(
                style: TextStyle(color: Colors.black87),
                decoration: InputDecoration(
                  border: InputBorder.none,
                  contentPadding: EdgeInsets.symmetric(horizontal: 16),
                ),
              ),
            ),
          ),
          SizedBox(width: 16),
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'GATE OUT TIME',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Card(
              elevation: 5,
              borderOnForeground: true,
              color: Colors.white,
              child: TextFormField(
                style: TextStyle(color: Colors.black87),
                decoration: InputDecoration(
                  border: InputBorder.none,
                  contentPadding: EdgeInsets.symmetric(horizontal: 16),
                ),
              ),
            ),
          ),
        ],
      ),
    ),

    // Tare & Gross Weight Row
    Padding(
      padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
      child: Row(
        children: [
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'TARE WEIGHT',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Row(
              children: [
                Expanded(
                  flex: 2,
                  child: Card(
                    elevation: 5,
                    borderOnForeground: true,
                    color: Colors.white,
                    child: TextFormField(
                      style: TextStyle(color: Colors.black87),
                      decoration: InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.symmetric(horizontal: 16),
                      ),
                    ),
                  ),
                ),
                SizedBox(width: 4),
                Expanded(
                  flex: 1,
                  child: Card(
                    elevation: 5,
                    borderOnForeground: true,
                    color: Colors.white,
                    child: TextFormField(
                      style: TextStyle(color: Colors.black87),
                      decoration: InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.symmetric(horizontal: 16),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
          SizedBox(width: 16),
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'GROSS WEIGHT',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Row(
              children: [
                Expanded(
                  flex: 2,
                  child: Card(
                    elevation: 5,
                    borderOnForeground: true,
                    color: Colors.white,
                    child: TextFormField(
                      style: TextStyle(color: Colors.black87),
                      decoration: InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.symmetric(horizontal: 16),
                      ),
                    ),
                  ),
                ),
                SizedBox(width: 4),
                Expanded(
                  flex: 1,
                  child: Card(
                    elevation: 5,
                    borderOnForeground: true,
                    color: Colors.white,
                    child: TextFormField(
                      style: TextStyle(color: Colors.black87),
                      decoration: InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.symmetric(horizontal: 16),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    ),

    // Net Weight Row
    Padding(
      padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
      child: Row(
        children: [
          Expanded(flex: 2, child: SizedBox()), // Empty space matching label width
          SizedBox(width: 8),
          Expanded(flex: 3, child: SizedBox()), // Empty space matching input width
          SizedBox(width: 16),
          Expanded(
            flex: 2,
            child: Align(
              alignment: Alignment.centerRight,
              child: Text(
                'NET WEIGHT',
                style: TextStyle(
                  color: Colors.black87,
                  fontSize: 16,
                  fontFamily: 'Lato',
                ),
              ),
            ),
          ),
          SizedBox(width: 8),
          Expanded(
            flex: 3,
            child: Row(
              children: [
                Expanded(
                  flex: 2,
                  child: Card(
                    elevation: 5,
                    borderOnForeground: true,
                    color: Colors.white,
                    child: TextFormField(
                      style: TextStyle(color: Colors.black87),
                      decoration: InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.symmetric(horizontal: 16),
                      ),
                    ),
                  ),
                ),
                SizedBox(width: 4),
                Expanded(
                  flex: 1,
                  child: Card(
                    elevation: 5,
                    borderOnForeground: true,
                    color: Colors.white,
                    child: TextFormField(
                      style: TextStyle(color: Colors.black87),
                      decoration: InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.symmetric(horizontal: 16),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    ),
  ],
)

Key Improvements in This Code

  • Flexible Proportions: Using Expanded with flex values ensures labels and input fields take consistent relative space across all devices.
  • Consistent Spacing: Replaced arbitrary padding with SizedBox and symmetric padding to maintain uniform gaps between elements.
  • Aligned Labels: Used Align(alignment: Alignment.centerRight) for labels to keep them consistently right-aligned next to inputs.
  • Removed Fixed Widths: Eliminated hardcoded widths that caused alignment issues on different screen sizes.

This approach will make your form layout responsive and keep all elements aligned perfectly, no matter what device it's running on.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:37:41