如何使按钮宽度与父级匹配?
How to make button width match parent?
我想知道如何设置宽度以匹配父级布局宽度
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
可以双向扩展视图,我不知道该怎么做。
经过一番研究,我找到了一些解决方案,感谢@Günter Zöchbauer,
我使用了列而不是容器,
将 属性 设置为列 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,
),
],
),
更新:
在 Flutter 2.0 中,RaisedButton
已被弃用并被 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(...),
)
Container(
width: double.infinity,
child: RaisedButton(...),
),
使用 ListTile
也可以,因为列表会填满整个宽度:
ListTile(
title: new RaisedButton(...),
),
new SizedBox(
width: 100.0,
child: new RaisedButton(...),
)
可以使用 ButtonTheme
和 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'),
),
),
以下代码对我有用
ButtonTheme(
minWidth: double.infinity,
child: RaisedButton(child: Text("Click!!", style: TextStyle(color: Colors.white),), color: Colors.pink, onPressed: () {}))
@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
控制器 获取整体 保持 宽度 和 高度.
这在一个独立的小部件中为我工作。
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.
最简单的方法是使用 FlatButton
包裹在 Container
中,该按钮默认采用其父级的大小,因此为 Container
分配所需的宽度。
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,
),
),
),
)
输出:
在上面给定的代码中给出匹配父宽度或高度的最简单方法。
...
width: double.infinity,
height: double.infinity,
...
这对我有用。
SizedBox(
width: double.maxFinite,
child: RaisedButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
child: new Text("Button 2"),
color: Colors.lightBlueAccent,
onPressed: () => debugPrint("Button 2"),
),
),
对于 match_parent
你可以使用
SizedBox(
width: double.infinity, // match_parent
child: RaisedButton(...)
)
您可以使用任何特定值
SizedBox(
width: 100, // specific value
child: RaisedButton(...)
)
这个对我有用
width: MediaQuery.of(context).size.width-100,
您可以使用 MaterialButton
MaterialButton(
padding: EdgeInsets.all(12.0),
minWidth: double.infinity,
onPressed: () {},
child: Text("Btn"),
)
您可以通过
设置小部件的匹配父级
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) 使用 MediaQuery:
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,
),
),
RaisedButton(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [Text('Submit')],
)
)
对我有用。
最基本的方法是通过将其宽度定义为无限来使用 Container。请参阅下面的代码示例
Container(
width: double.infinity,
child:FlatButton(
onPressed: () {
//your action here
},
child: Text("Button"),
)
)
OutlineButton(
onPressed: () {
logInButtonPressed(context);
},
child: Container(
width: MediaQuery.of(context).size.width / 2,
child: Text(
“Log in”,
textAlign: TextAlign.center,
),
),
)
像这样的东西对我有用。
用中心小部件包裹您的(具有固定宽度的子小部件)。这将使您的小部件居中:
Center(child:Container(width:250,child:TextButton(child:Text("Button Name),),)
随着 Flutter 2.0 RaisedButton
被弃用并被 ElevatedButton
取代。
ElevatedButton
小部件的 minimumSize
属性 正是这样做的。
示例代码:
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'),
)
您可以将 ButtonStyle
的 fixedSize.width
设置为一个非常大的数字,例如 double.maxFinite
。如果您不想指定高度,也可以使用 Size.fromWidth()
构造函数:
ElevatedButton(
child: const Text('Button'),
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromWidth(double.maxFinite),
),
),
Live Demo
制作全宽按钮的方法有很多种。但是我想你应该明白在不同场景下制作全宽小部件的概念:
当您使用嵌套小部件时,很难识别父小部件的宽度。简单地说,您不能在嵌套的小部件中指定宽度。因此,您应该使用 Expanded 或 Column 并将 CrossAxisAlignment 用作 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,
)
)
从我的角度来看,推荐将是第一个。您也可以将 MaterialButton
更改为 ElevatedButton
或 TextButton
或 RaisedButton (Depreciated)
或任何其他小部件。
干杯!
我想知道如何设置宽度以匹配父级布局宽度
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
可以双向扩展视图,我不知道该怎么做。
经过一番研究,我找到了一些解决方案,感谢@Günter Zöchbauer,
我使用了列而不是容器,
将 属性 设置为列 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,
),
],
),
更新:
在 Flutter 2.0 中,RaisedButton
已被弃用并被 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(...),
)
Container(
width: double.infinity,
child: RaisedButton(...),
),
使用 ListTile
也可以,因为列表会填满整个宽度:
ListTile(
title: new RaisedButton(...),
),
new SizedBox(
width: 100.0,
child: new RaisedButton(...),
)
可以使用 ButtonTheme
和 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'),
),
),
以下代码对我有用
ButtonTheme(
minWidth: double.infinity,
child: RaisedButton(child: Text("Click!!", style: TextStyle(color: Colors.white),), color: Colors.pink, onPressed: () {}))
@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
控制器 获取整体 保持 宽度 和 高度.
这在一个独立的小部件中为我工作。
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.
最简单的方法是使用 FlatButton
包裹在 Container
中,该按钮默认采用其父级的大小,因此为 Container
分配所需的宽度。
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,
),
),
),
)
输出:
在上面给定的代码中给出匹配父宽度或高度的最简单方法。
...
width: double.infinity,
height: double.infinity,
...
这对我有用。
SizedBox(
width: double.maxFinite,
child: RaisedButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
child: new Text("Button 2"),
color: Colors.lightBlueAccent,
onPressed: () => debugPrint("Button 2"),
),
),
对于 match_parent
你可以使用
SizedBox(
width: double.infinity, // match_parent
child: RaisedButton(...)
)
您可以使用任何特定值
SizedBox(
width: 100, // specific value
child: RaisedButton(...)
)
这个对我有用
width: MediaQuery.of(context).size.width-100,
您可以使用 MaterialButton
MaterialButton(
padding: EdgeInsets.all(12.0),
minWidth: double.infinity,
onPressed: () {},
child: Text("Btn"),
)
您可以通过
设置小部件的匹配父级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) 使用 MediaQuery:
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,
),
),
RaisedButton(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [Text('Submit')],
)
)
对我有用。
最基本的方法是通过将其宽度定义为无限来使用 Container。请参阅下面的代码示例
Container(
width: double.infinity,
child:FlatButton(
onPressed: () {
//your action here
},
child: Text("Button"),
)
)
OutlineButton(
onPressed: () {
logInButtonPressed(context);
},
child: Container(
width: MediaQuery.of(context).size.width / 2,
child: Text(
“Log in”,
textAlign: TextAlign.center,
),
),
)
像这样的东西对我有用。
用中心小部件包裹您的(具有固定宽度的子小部件)。这将使您的小部件居中:
Center(child:Container(width:250,child:TextButton(child:Text("Button Name),),)
随着 Flutter 2.0 RaisedButton
被弃用并被 ElevatedButton
取代。
ElevatedButton
小部件的 minimumSize
属性 正是这样做的。
示例代码:
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'),
)
您可以将 ButtonStyle
的 fixedSize.width
设置为一个非常大的数字,例如 double.maxFinite
。如果您不想指定高度,也可以使用 Size.fromWidth()
构造函数:
ElevatedButton(
child: const Text('Button'),
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromWidth(double.maxFinite),
),
),
Live Demo
制作全宽按钮的方法有很多种。但是我想你应该明白在不同场景下制作全宽小部件的概念:
当您使用嵌套小部件时,很难识别父小部件的宽度。简单地说,您不能在嵌套的小部件中指定宽度。因此,您应该使用 Expanded 或 Column 并将 CrossAxisAlignment 用作 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,
)
)
从我的角度来看,推荐将是第一个。您也可以将 MaterialButton
更改为 ElevatedButton
或 TextButton
或 RaisedButton (Depreciated)
或任何其他小部件。
干杯!