152

如何在 Flutter 中垂直居中列?我使用了小部件“新中心”。我使用了小部件“新中心”,但它没有垂直居中我的列?任何想法都会有所帮助....

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("Thank you"),
    ),
    body: new Center(
      child: new Column(
        children: <Widget>[
          new Padding(
            padding: new EdgeInsets.all(25.0),
            child: new AnimatedBuilder(
              animation: animationController,
              child: new Container(
                height: 175.0,
                width: 175.0,
                child: new Image.asset('assets/angry_face.png'),
              ),
              builder: (BuildContext context, Widget _widget) {
                return new Transform.rotate(
                  angle: animationController.value * 6.3,
                  child: _widget,
                );
              },
            ),
          ),
          new Text('We are glad we could serve you...', style: new TextStyle(
              fontSize: 16.0,
              fontWeight: FontWeight.w600,
              color: Colors.black87),),
          new Padding(padding: new EdgeInsets.symmetric(vertical: 5.0, horizontal: 0.0)),
          new Text('We appreciate your feedback ! !', style: new TextStyle(
              fontSize: 13.0,
              fontWeight: FontWeight.w200,
              color: Colors.black87),),
        ],
      ),
    ),
  );
}
4

11 回答 11

273

Aziz 提出的解决方案是:

Column(
  mainAxisAlignment: MainAxisAlignment.center,
  crossAxisAlignment: CrossAxisAlignment.center,
  children: [
    //your widgets here...
  ],
)

由于填充,它不会位于确切的中心:

padding: EdgeInsets.all(25.0),

要准确地制作中心列 - 至少在这种情况下 - 您需要删除填充。

于 2018-07-26T19:31:51.627 回答
56

尝试:

Column(
 mainAxisAlignment: MainAxisAlignment.center,
 crossAxisAlignment: CrossAxisAlignment.center,
 children:children...)
于 2018-07-26T19:16:19.777 回答
23

使用列,使用:

mainAxisAlignment: MainAxisAlignment.center

它将其子项垂直对齐其父空间的中心

于 2019-12-09T13:58:06.087 回答
17

试试这个。它垂直和水平居中。

Center(
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: children,
  ),
)
于 2020-06-21T01:44:09.577 回答
16

您可以使用 mainAxisAlignment 和 crossAxisAlignment 属性控制行或列如何对齐其子项。对于一行,主轴水平运行,交叉轴垂直运行。对于列,主轴垂直运行,横轴水平运行。

 mainAxisAlignment: MainAxisAlignment.center,
 crossAxisAlignment: CrossAxisAlignment.center,
于 2020-02-05T00:13:01.103 回答
12

使用 Column 时,在 column 小部件中使用它:

mainAxisAlignment: MainAxisAlignment.center

它将其子项与其父项的中心对齐 空间是其主轴,即垂直

或者,使用 Center 小部件包装列:

Center(
  child: Column(
    children: <ListOfWidgets>,
  ),
)

如果它不能解决问题,请使用 Expanded 小部件包装父容器。

Expanded(
   child:Container(
     child: Column(
       mainAxisAlignment: MainAxisAlignment.center,
       children: children,
     ),
   ),
)
于 2020-11-25T07:18:28.490 回答
12

另一个解决方案!

如果您想以中心垂直形式设置小部件,您可以使用 ListView 。例如:我使用了三个按钮并将它们添加到 ListView 中,然后是

shrinkWrap: true -> 使用这个 ListView 只占用需要的空间。

import 'package:flutter/material.dart';

class List extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final button1 =
        new RaisedButton(child: new Text("Button1"), onPressed: () {});
    final button2 =
        new RaisedButton(child: new Text("Button2"), onPressed: () {});
    final button3 =
        new RaisedButton(child: new Text("Button3"), onPressed: () {});
    final body = new Center(
      child: ListView(
        shrinkWrap: true,
        children: <Widget>[button1, button2, button3],
     ),
    );

    return new Scaffold(
        appBar: new AppBar(
          title: Text("Sample"),
        ),
        body: body);
  }
}    
void main() {
  runApp(new MaterialApp(
    home: List(),
  ));
}

输出:

在此处输入图像描述

于 2019-06-02T18:36:10.377 回答
7

CrossAlignment.center 使用Width of the 'Child Widget'自身居中,因此在页面开头呈现。

Column is centered within the page body's 'Center Container',CrossAlignment.center 使用页面主体的“中心”作为参考,并将小部件呈现在页面的中心

在此处输入图像描述

代码

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
    title:"DynamicWidgetApp",
    home:DynamicWidgetApp(),

));

class DynamicWidgetApp extends StatefulWidget{
  @override
  DynamicWidgetAppState createState() => DynamicWidgetAppState();
  }

class  DynamicWidgetAppState extends State<DynamicWidgetApp>{
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: Center(
     //Removing body:Center will change the reference
    // and render the widget at the start of the page 
        child: Column(
            mainAxisAlignment : MainAxisAlignment.center,
            crossAxisAlignment : CrossAxisAlignment.center,
            children: [
              Text("My Centered Widget"),
            ]
          ),
      ),
      floatingActionButton: FloatingActionButton(
        // onPressed: ,
        child : Icon(Icons.add),
      ),
      );
    }
  }
于 2021-02-09T08:25:40.267 回答
6

对我来说,问题是在我必须删除的列内展开了它并且它起作用了。

Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Expanded( // remove this
              flex: 2,
              child: Text("content here"),
            ),
          ],
        )
于 2020-09-10T11:07:17.300 回答
3

你可以用。 mainAxisAlignment:MainAxisAlignment.center 这将使材料通过列中的中心。`crossAxisAlignment: CrossAxisAlignment.center' 这将在行的中心对齐项目。

Container( alignment:Alignment.center, Child: Column () )

简单地使用。 Center ( Child: Column () ) 或使用 Padding 小部件说唱。并调整 Padding 使列子位于中心。

于 2020-07-26T13:45:48.477 回答
0

您也可以ColumnAlign.

Align(
    alignment: Alignment.center,
    child: Column(
        children: [
            Container(
                width: 300,
                margin: const EdgeInsets.fromLTRB(0, 70, 0, 0),
                child: TextFormField(decoration: const InputDecoration(hintText: "First Name"))
            ),
            ...
        ]
    )
)

查看此网站以了解使小部件居中的不同方式:链接

于 2022-03-01T06:57:20.043 回答