Flutter:如何使按钮扩展到其父按钮的大小?

Flutter: How to make a button expand to the size of its parent?

我正在尝试创建方形按钮,但 Expanded 的工作方式似乎与容器不同。以下面的代码为例

new Expanded(
 flex: 2,
   child: new Column(
     children: <Widget>[
       new Expanded(
         child:new Row(
           children: <Widget>[
             new Expanded(child: new MaterialButton(...)),
             new Expanded(child: new MaterialButton(....)),

             new Expanded(child: new Container(color: Colors.red)),
             new Expanded(child: new Container(color: Colors.green)),
           ]
         )
       )
     ],
   )
 )

 ....

它显示两个水平展开但不是垂直展开的按钮。同时,容器将水平和垂直扩展。如果我执行以下操作,则会出现相同的效果:

new Expanded(
 flex: 2,
   child: new Column(
     children: <Widget>[
       new Expanded(
         child:new Column(
           children: <Widget>[
             new Expanded(child: new MaterialButton(...)),
             new Expanded(child: new MaterialButton(....)),

             new Expanded(child: new Container(color: Colors.red)),
             new Expanded(child: new Container(color: Colors.green)),
           ]
         )
       )
     ],
   )
 )

 ....

我已将行更改为列。按钮会垂直展开,但不会水平展开,而容器会同时展开。

有没有办法让我的按钮展开以在垂直和水平方向上都适合它们的父按钮?

crossAxisAlignment 属性 添加到您的 Row;

crossAxisAlignment: CrossAxisAlignment.stretch

ButtonThememinWidth: 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'),
    ),
  ),

你也可以试试

  1. 使用SizedBox

    SizedBox(
      width: double.maxFinite, // set width to maxFinite
      child: RaisedButton(...),
    )
    
  2. 使用 MaterialButtonminWidth 属性。

    MaterialButton(
      minWidth: double.maxFinite, // set minWidth to maxFinite
      color: Colors.blue,
      onPressed: () {},
      child: Text("Button"),
    )
    

我们可以在Container里面添加Button。

解法:

Container(
            width: double.infinity,
            child: RaisedButton(
              onPressed: null,
              child: Text('NEXT'),
            ),
          )

您可以在child:column

下插入

横轴对齐:CrossAxisAlignment.stretch

我的代码

我的结果

在 Flutter 2.+ 中考虑这个解决方案:


ElevatedButton(
  style: ElevatedButton.styleFrom(
    minimumSize: const Size(double.infinity, double.infinity), // <--- this line helped me
  ),
  onPressed: () {},
  child: Icon(
    Icons.keyboard_return
  ),
)
MaterialButton(
          minWidth: MediaQuery.of(context).size.width, // set minWidth to width of the device screen
          onPressed: () {},
          child: Text("Button"),
        )

供参考https://api.flutter.dev/flutter/widgets/MediaQuery-class.html

VisualDensity 就是您要找的东西。将其添加到 ButtonStyle 对象。

ElevatedButton(
  style: const ButtonStyle(
    visualDensity: VisualDensity(
      horizontal: VisualDensity.maximumDensity,
      vertical: VisualDensity.maximumDensity,
    ),
  ),
  ...
),