在 TextField Flutter 中垂直居中对齐文本

The*_*299 13 text vertical-alignment textfield flutter

我尝试在很多资源中查找,但不幸的是我找不到将文本垂直居中对齐的方法。我也尝试使用 suffixIcon 而不是 suffix 但仍然没有运气。这是我的代码:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _HomePageState();
  }
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: Icon(
          Icons.menu,
          color: Colors.black,
        ),
        backgroundColor: Colors.white,
        title: Container(
          margin: EdgeInsets.only(bottom: 10),
          child: Image.asset(
            "icons/logo.png",
          ),
        ),
        bottom: PreferredSize(
          child: Padding(
            padding: EdgeInsets.only(
              left: 10,
              right: 10,
              bottom: 10,
            ),
            child: Container(
              height: 40,
              child: TextField(
                textAlignVertical: TextAlignVertical.center,
                textAlign: TextAlign.left,
                maxLines: 1,
                style: TextStyle(
                  fontSize: 13,
                ),
                decoration: InputDecoration(
                    suffixIcon: IconButton(icon: Icon(Icons.search, color: Colors.black,), onPressed: (){}),
                    border: OutlineInputBorder(
                      borderSide: BorderSide(
                        color: Colors.black,
                      ),
                      borderRadius: BorderRadius.all(Radius.circular(15)),
                    )
                ),
              ),
            ),
          ),
          preferredSize: Size(MediaQuery.of(context).size.width, 50),
        ),
      ),
      body: Container(
        margin: EdgeInsets.only(top: 11),
        child: Column(
          children: <Widget>[
            Carousel(),
          ],
        ),
      ),
    );
  }
}

class Carousel extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _CarouselState();
  }
}

class _CarouselState extends State<Carousel> {
  List<String> urls = [];

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 10),
      child: Stack(
        children: <Widget>[
          Image.network(
              "someImageUrlHere."),
          Positioned(
            bottom: 5,
            width: MediaQuery.of(context).size.width - 20,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text("•"),
                Text("•"),
                Text("•"),
                Text("•"),
                Text("•"),
              ],
            ),
          ),
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

导致此问题的问题可能是什么?我该如何解决这个问题?

小智 17

我有单行文本字段的解决方案。将 TextField 放置在具有高度属性的容器中(在我的情况下,也是宽度),然后在装饰中提供一个 contentPadding 值,其值为 height / 2。

代码如下:

          Container(
            height: textfieldDimension,
            width: textfieldDimension,
            alignment: Alignment.center,

            child: TextField(
              decoration: InputDecoration(
                border: InputBorder.none,
                contentPadding: EdgeInsets.only(
                  bottom: textfieldDimension / 2,  // HERE THE IMPORTANT PART
                )

              ),
              // textAlignVertical: TextAlignVertical.center,  THIS DOES NOT WORK



              textAlign: TextAlign.center,
              style: TextStyle(
                fontSize: 10,   // This is not so important
              ),
            ),
          ),
Run Code Online (Sandbox Code Playgroud)


小智 12

在此输入图像描述

尝试这个:

Container(
      height: 36,
      child: TextField(
        maxLines: 1,
        style: TextStyle(fontSize: 17),
        textAlignVertical: TextAlignVertical.center,
        decoration: InputDecoration(
          filled: true,
          prefixIcon:
              Icon(Icons.search, color: Theme.of(context).iconTheme.color),
          border: OutlineInputBorder(
              borderSide: BorderSide.none,
              borderRadius: BorderRadius.all(Radius.circular(30))),
          fillColor: Theme.of(context).inputDecorationTheme.fillColor,
          contentPadding: EdgeInsets.zero,
          hintText: 'Search',
        ),
      ),
    )
Run Code Online (Sandbox Code Playgroud)


KuK*_*uKu 5

请尝试按列换行并使用“MainAxisAlignment.center”添加“mainAxisAlignment”属性

    Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.start, // If you want align text to left
          children: <Widget>[
            TextField(
                textAlignVertical: TextAlignVertical.center,
                textAlign: TextAlign.left,
                maxLines: 1,
                style: TextStyle(
                  fontSize: 13,
                ),
                decoration: InputDecoration(
                    suffixIcon: IconButton(icon: Icon(Icons.search, color: Colors.black,), onPressed: (){}),
                    border: OutlineInputBorder(
                      borderSide: BorderSide(
                        color: Colors.black,
                      ),
                      borderRadius: BorderRadius.all(Radius.circular(15)),
                    )
                ),
              ),
          ],
        ),
      )
Run Code Online (Sandbox Code Playgroud)


Par*_*iya 5

对齐 TextField 中垂直居中的文本。你可以设置 contentPadding 你的TextField进入EdgeInsets.zero

这是实现这一目标的方法

TextField(
  decoration: InputDecoration(
    contentPadding: EdgeInsets.zero,
    hintText: "password",
  ),
)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 5

TextField(
   textAlign: TextAlign.center,
   decoration: InputDecoration(
     hintText: "Centered Hint",
   ),
)
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。

  • `textAlign: TextAlign.center` 将水平对齐文本。要垂直对齐,您需要使用“textAlignVertical: TextAlignVertical.center”属性。 (16认同)
  • @MohamedYousof 不,这不会使文本垂直居中,只是水平居中。 (5认同)
  • 如果问题出在 TextField 的“decoration:InputDecoration”中的“contentPadding”,那么这没有帮助。正如 komnataDeveloper 的答案中所述,您需要设置 contentPadding。我会将其设置为零,然后居中就可以了。 (2认同)

Uni*_*Uni 5

最简单的方法是使用内置TextAlign属性来垂直或水平对齐:

TextField(
   textAlign: TextAlign.center, // Align horizontally
   textAlignVertical: TextAlignVertical.center, // Align vertically
)
Run Code Online (Sandbox Code Playgroud)


小智 5

像这样放置 contentPadding 和 isDense。

 decoration: InputDecoration(
    contentPadding: EdgeInsets.zero,
     isDense: true,
       hintText: 'Name',)
Run Code Online (Sandbox Code Playgroud)