183

我想知道如何设置宽度以匹配父布局宽度

new Container(
  width: 200.0,
  padding: const EdgeInsets.only(top: 16.0),
  child: new RaisedButton(
    child: new Text(
      "Submit",
      style: new TextStyle(
        color: Colors.white,
      )
    ),
    colorBrightness: Brightness.dark,
    onPressed: () {
      _loginAttempt(context);
    },
    color: Colors.blue,
  ),
),

我对小Expanded部件有所了解,但Expanded将视图扩展到两个方向,我不知道该怎么做。

4

23 回答 23

392

更新:

Flutter 2.0RaisedButton已弃用并由ElevatedButton. 你可以minimumSize这样使用:

ElevatedButton(
        style: ElevatedButton.styleFrom(
          minimumSize: Size.fromHeight(40), // fromHeight use double.infinity as width and 40 is the height
        ),
        onPressed: () {},
        child: Text('Text Of Button'),
      )

Flutter 小于 2.0 的旧答案:

正确的解决方案是使用SizedBox.expand小部件,它强制其child匹配其父级的大小。

SizedBox.expand(
  child: RaisedButton(...),
)

有许多替代方案,可以或多或少地进行定制:

SizedBox(
  width: double.infinity,
  // height: double.infinity,
  child: RaisedButton(...),
)

或使用ConstrainedBox

ConstrainedBox(
    constraints: const BoxConstraints(minWidth: double.infinity),
    child: RaisedButton(...),
)
于 2018-04-25T08:09:22.553 回答
41
Container(
  width: double.infinity,
  child: RaisedButton(...),
),
于 2018-05-22T16:06:17.857 回答
40

可以使用ButtonThemewith提供 size 属性minWidth: double.infinity

ButtonTheme(
  minWidth: double.infinity,
  child: MaterialButton(
    onPressed: () {},
    child: Text('Raised Button'),
  ),
),

或者在https://github.com/flutter/flutter/pull/19416登陆之后

MaterialButton(
  onPressed: () {},
  child: SizedBox.expand(
    width: double.infinity, 
    child: Text('Raised Button'),
  ),
),
于 2018-07-17T08:20:31.173 回答
35

经过一番研究,我找到了一些解决方案,感谢@Günter Zöchbauer,

我使用 column 而不是 Container 和

将属性设置为列CrossAxisAlignment.stretch以填充按钮的匹配父项

    new Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                new RaisedButton(
                  child: new Text(
                      "Submit",
                      style: new TextStyle(
                        color: Colors.white,
                      )
                  ),
                  colorBrightness: Brightness.dark,
                  onPressed: () {
                    _loginAttempt(context);
                  },
                  color: Colors.blue,
                ),
              ],
            ),
于 2018-04-25T05:27:31.113 回答
31

最简单的方法是使用FlatButton包裹ContainerContainer.

            Container(
                  color: Colors.transparent,
                  width: MediaQuery.of(context).size.width,
                  height: 60,
                  child: FlatButton(
                    shape: new RoundedRectangleBorder(
                      borderRadius: new BorderRadius.circular(30.0),
                    ),
                    onPressed: () {},
                    color: Colors.red[300],
                    child: Text(
                      "Button",
                      style: TextStyle(
                        color: Colors.black,
                        fontFamily: 'Raleway',
                        fontSize: 22.0,
                      ),
                    ),
                  ),
                )

输出:

在此处输入图像描述

于 2019-02-16T02:49:32.267 回答
10

您可以通过以下方式设置小部件的匹配父级

1)将宽度设置为double.infinity

new Container(
          width: double.infinity,
          padding: const EdgeInsets.only(top: 16.0),
          child: new RaisedButton(
            child: new Text(
                "Submit",
                style: new TextStyle(
                  color: Colors.white,
                )
            ),
            colorBrightness: Brightness.dark,
            onPressed: () {
              _loginAttempt(context);
            },
            color: Colors.blue,
          ),
        ),

2)使用媒体查询:

new Container(
          width: MediaQuery.of(context).size.width,
          padding: const EdgeInsets.only(top: 16.0),
          child: new RaisedButton(
            child: new Text(
                "Submit",
                style: new TextStyle(
                  color: Colors.white,
                )
            ),
            colorBrightness: Brightness.dark,
            onPressed: () {
              _loginAttempt(context);
            },
            color: Colors.blue,
          ),
        ),
于 2020-02-01T16:07:06.420 回答
7

@Mohit Suthar,

找到了将父级匹配宽度高度的最佳解决方案之一,如下所示

new Expanded(
          child: new Container(
              padding: EdgeInsets.all(16.0),
              margin: EdgeInsets.all(16.0),
              decoration: new BoxDecoration(
                  color: Colors.white,
                  borderRadius:
                      const BorderRadius.all(const Radius.circular(8.0)),
                  border: new Border.all(color: Colors.black, width: 1.0)),
              child: new Text("TejaDroid")),
        ), 

在这里,您可以检查Expanded控制器是否获取整个剩余宽度高度

于 2018-09-18T08:37:44.113 回答
6

在上面的给定代码中给出匹配父宽度或高度的最简单方法。

...
width: double.infinity,
height: double.infinity,
...
于 2019-03-28T07:47:38.073 回答
4

因为match_parent你可以使用

SizedBox(
  width: double.infinity, // match_parent
  child: RaisedButton(...)
)

对于您可以使用的任何特定值

SizedBox(
  width: 100, // specific value
  child: RaisedButton(...)
)
于 2019-06-03T18:18:13.647 回答
3

你可以用MaterialButton做到这一点

MaterialButton(
     padding: EdgeInsets.all(12.0),
     minWidth: double.infinity,
     onPressed: () {},
    child: Text("Btn"),
)
于 2020-01-23T02:45:05.037 回答
2

最基本的方法是通过将其宽度定义为无限来使用 Container。请参见下面的代码示例

Container(
    width: double.infinity,
    child:FlatButton(
        onPressed: () {
            //your action here
        },
        child: Text("Button"),

    )
)
于 2020-02-08T12:25:12.307 回答
2
         OutlineButton(
              onPressed: () {
                logInButtonPressed(context);
              },
              child: Container(
                width: MediaQuery.of(context).size.width / 2,
                child: Text(
                  “Log in”,
                  textAlign: TextAlign.center,
                ),
              ),
            )

像这样的东西对我有用。

于 2020-03-03T11:39:01.027 回答
2

有很多方法可以制作全宽按钮。但我认为你应该了解在不同场景下制作全宽小部件的概念:

当您使用嵌套小部件时,很难识别父小部件的宽度。只是您不能在嵌套小部件中指定宽度。因此,您应该使用 Expanded 或带有 CrossAxisAlignment 的 Column 作为 Strech。

在其他情况下,您可以使用媒体查询宽度或 double.infinity。

以下是嵌套小部件和单个小部件的一些示例:

第一的:

Expanded(   // This will work for nested widgets and will take width of first parent widget.
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

第二:

Column( // This will not work if parent widget Row.
  crossAxisAlignment: CrossAxisAlignment.stretch,
  children: <Widget>[
    MaterialButton(
      onPressed: () {},
      child: const Text("Button Text"),
      color: Colors.indigo,
      textColor: Colors.white,
    )
  ]
)

第三:

ButtonTheme( // if use media query, then will not work for nested widgets.
  minWidth: double.infinity,  //Or use 'width: MediaQuery.of(context).size.width'
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

向前:

SizedBox( // if use media query, then will not work for nested widgets.
  width: double.infinity, //Or use 'width: MediaQuery.of(context).size.width'
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

第五:

Container( // if use media query, then will not work for nested widgets.
  width: double.infinity, //Or use 'width: MediaQuery.of(context).size.width'
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

从我的角度来看,推荐的将是第一个。您也可以更改MaterialButtonElevatedButtonTextButtonRaisedButton (Depreciated)或任何其他小部件。

干杯!

于 2021-09-30T08:00:05.277 回答
1

以下代码对我有用

       ButtonTheme(
            minWidth: double.infinity,
            child: RaisedButton(child: Text("Click!!", style: TextStyle(color: Colors.white),), color: Colors.pink, onPressed: () {}))
于 2018-08-17T06:39:10.693 回答
1

这在一个独立的小部件中为我工作。

  Widget signinButton() {
    return ButtonTheme(
      minWidth: double.infinity,
      child: new FlatButton(
        onPressed: () {},
        color: Colors.green[400],
        textColor: Colors.white,
        child: Text('Flat Button'),
      ),
    );
  }

// It can then be used in a class that contains a widget tree.
于 2018-10-29T23:58:27.820 回答
1

这对我有用。

    SizedBox(
             width: double.maxFinite,
             child: RaisedButton(
                 materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                 child: new Text("Button 2"),
                 color: Colors.lightBlueAccent,
                 onPressed: () => debugPrint("Button 2"),
              ),
     ), 
于 2019-04-08T01:20:12.443 回答
1

RaisedButton( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Submit')], ) ) 这个对我有用。

于 2020-02-03T09:06:55.980 回答
1

Flutter 2.0 RaisedButton已弃用并由ElevatedButton.

minimumSize小部件的属性ElevatedButton正是这样做的。

示例代码:

ElevatedButton(
            style: ElevatedButton.styleFrom(
              primary: Colors.green,
              onPrimary: Colors.white,
              shadowColor: Colors.greenAccent,
              elevation: 3,
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(20.0)),
              minimumSize: Size(100, 40), //////// HERE
            ),
            onPressed: () {},
            child: Text('MyButton'),
          )
于 2021-05-06T07:18:47.690 回答
1

您可以将 的 设置fixedSize.widthButtonStyle一个非常大的数字,例如double.maxFinite. Size.fromWidth()如果您不想指定高度,也可以使用构造函数:

ElevatedButton(
  child: const Text('Button'),
  style: ElevatedButton.styleFrom(
    fixedSize: const Size.fromWidth(double.maxFinite),
  ),
),

现场演示

于 2021-08-28T20:29:01.853 回答
0

使用 aListTile也可以,因为列表填充了整个宽度:

ListTile(
  title: new RaisedButton(...),
),
于 2018-05-28T09:19:34.287 回答
0
 new SizedBox(
  width: 100.0,
     child: new RaisedButton(...),
)
于 2018-07-11T13:30:57.807 回答
0

这个对我有用

width: MediaQuery.of(context).size.width-100,
于 2020-01-18T09:59:13.117 回答
0

用中心小部件包裹您的(具有固定宽度的子小部件)。这将使您的小部件居中:

Center(child:Container(width:250,child:TextButton(child:Text("Button Name),),)
于 2021-04-22T06:32:00.570 回答