在 Flutter 中对齐多行 TextField 中的提示文本

Posted

技术标签:

【中文标题】在 Flutter 中对齐多行 TextField 中的提示文本【英文标题】:Align hint text in multiline TextField in Flutter 【发布时间】:2020-11-25 23:59:07 【问题描述】:

我有一个带有前缀图标的多行文本字段,所以现在图标位于垂直中心,提示文本位于左上角。我希望它们都对齐,无论是在顶部还是在垂直中心。

使用的代码是

    Padding(
          padding: const EdgeInsets.symmetric(horizontal: 10.0),
          child: TextField(
            maxLines: 3,
            decoration: InputDecoration(
              hintText: 'Bio',
              prefixIcon: Icon(Icons.chrome_reader_mode),
              fillColor: Colors.grey[200],
              filled: true,
              border: OutlineInputBorder(
                borderRadius: BorderRadius.circular(10.0),
                borderSide: BorderSide(),
              ),
            ),
          ),
        ),

【问题讨论】:

尝试将TextField 包装在Column 小部件中并使用mainAxisAlignment: MainAxisAlignment.center 属性 试过了!没用! 【参考方案1】:
  Widget customTextView(String hint, Icon iconName) 
    return Container(
      decoration: BoxDecoration(
        color: _DarkWhiteColor.withOpacity(0.5),
        borderRadius: BorderRadius.circular(5),
      ),
      child: Padding(
        padding: const EdgeInsets.only(left: 0, right: 0),
        child: TextField(
          style: TextStyle(color: Colors.grey),
          cursorColor: Colors.grey,
          decoration: InputDecoration(
            border: InputBorder.none,
            focusedBorder: InputBorder.none,
            enabledBorder: InputBorder.none,
            errorBorder: InputBorder.none,
            disabledBorder: InputBorder.none,
            fillColor: _DarkWhiteColor.withOpacity(0),
            filled: true,
            hintText: "Enter Your Message",
            labelStyle: TextStyle(color: Colors.white),
//                suffixIcon: iconName,
            prefixIcon: Container(
              transform: Matrix4.translationValues(0, -45, 0),
              child: iconName,
            ),
          ),
          maxLines: 6,
        ),
      ),
    );
  

【讨论】:

你需要在装饰中使用icon,同时还要使用prefixIcon: Container( transform: Matrix4.translationValues(0, -45, 0), child: iconName, ),【参考方案2】:

虽然在您的特定情况下,问题可以通过添加换行符 (hintText: '\nBio') 来解决,但更好的解决方案是使用 labelText 属性而不是 hintText。默认情况下,标签与 TextField 的中心对齐。

      TextField(
        maxLines: 3,
        decoration: InputDecoration(
          labelText: 'Bio',
          prefixIcon: Icon(Icons.chrome_reader_mode),
          fillColor: Colors.grey[200],
          filled: true,
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(10.0),
            borderSide: BorderSide(),
          ),
        ),
      ),
   

【讨论】:

labelText 代替 hintText 工作正常,谢谢【参考方案3】:

这是一个丑陋的解决方案,但它有效。其他解决方案(例如,将 textAlignVertical 设置为 TextAlignVertical.center)不起作用,因为 maxLines 不为空

TextStyle 添加到hintText 并将TextStyleheight 设置为2.8。当fontSize 较大时,您需要减少它,因为height 将乘以fontSize 以形成行高。我添加了一个contentPadding 以确保文本不会溢出(因为现在文本从TextField 的中心开始)。

TextField(
                    maxLines: 3,
                    decoration: InputDecoration(
                      contentPadding: EdgeInsets.symmetric(vertical: 30),
                      hintText: 'Bio',
                      hintStyle: TextStyle(
                        height: 2.8,
                      ),
                      prefixIcon: Icon(Icons.chrome_reader_mode),
                      fillColor: Colors.grey[200],
                      filled: true,
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(10.0),
                        borderSide: BorderSide(),
                      ),
                    ),
                  ),

结果:

【讨论】:

以上是关于在 Flutter 中对齐多行 TextField 中的提示文本的主要内容,如果未能解决你的问题,请参考以下文章

在单个 TextField 中为多行下划线 - Flutter/Dart

如何垂直对齐 inputAdornment 使其保持在多行 MUI TextField 的顶部

Flutter TextField 提示文本对齐

Flutter TextField 居中对齐

Flutter 在多行中对齐文本

Flutter 中的表单