Flutter-ElevatedButton宽高设置
前言
Flutter的ElevatedButton
是一个很重要的Button
组件,想要设置ElevatedButton
的宽高有两种方式,
1.直接通过SizeBox
进行设置
2.通过ElevatedButton
的style
属性进行设置
默认情况下ElevatedButton
高度是固定的,宽度会跟随child
内容的大小自动调整。
我们将新建Flutter项目时的默认模板稍微改一下来作为我们本篇文章的demo模板。
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(onPressed: () {}, child: const Text("默认情况下的宽高")),
],
),
),
),
);
}
}
设置固定宽高
使用SizeBox
直接使用SizeBox
来设置宽高跟其他的控件方式是一致的,不赘述。
SizedBox(
width: 330,
height: 50,
child: ElevatedButton(
onPressed: () {},
child: const Text("设置固定宽高(使用SizeBox)"),
),
),
使用ElevatedButton
的style
属性
直接使用ButtonStyle
ElevatedButton
有一个style
参数,可以设置Button
相关的外观。style
类型为ButtonStyle?
,默认为null
。
在style
里设置了相应的参数之后,会有最高优先级。
设置
Button
大小的参数有3个,minimumSize
(最小的Size),maximumSize
(最大的Size),fixedSize
(固定的Size)。
一般来说,我们设置fixedSize
就可以了。
ElevatedButton(
onPressed: () {},
style: ButtonStyle(
fixedSize: MaterialStateProperty.all(const Size(330, 50)),
),
child: const Text("设置固定宽高(使用ButtonStyle)"),
),
使用ElevatedButton.styleFrom
上面使用ButtonStyle
有一个比较坑爹的地方,就是ButtonStyle
的属性大多是MaterialStateProperty
类型,需要使用MaterialStateProperty.all()
封装后才能使用。所以用起来比较麻烦。使用ElevatedButton.styleFrom()
的方式来生成ButtonStyle
会更加方便,因为Flutter已经为我们做了MaterialStateProperty
封装了,我们直接设置就可以。
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size(330, 50),
),
child: const Text("设置固定宽高(使用ElevatedButton.styleFrom)"),
),
只设置宽度,高度默认
使用SizeBox
SizedBox(
width: 330,
child: ElevatedButton(
onPressed: () {},
child: const Text("只设置宽度,高度默认(SizeBox)"),
),
),
使用ElevatedButton
的style
属性
这个只需要设置Size
的width
,而height
设置为double.infinity
即可。
Size.fromWidth(330)
和Size(330, double.infinity)
是一样的效果。
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromWidth(330),
),
child: const Text("只设置宽度,高度默认(style)"),
),
只设置高度,宽度默认
使用SizeBox
SizedBox(
height: 50,
child: ElevatedButton(
onPressed: () {},
child: const Text("只设置高度,宽度默认(SizeBox)"),
),
),
使用ElevatedButton
的style
属性
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromHeight(50),
),
child: const Text("只设置高度,宽度默认(style)"),
),
宽度占满,高度默认
使用SizeBox
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {},
child: const Text("宽度占满,高度默认(SizeBox)"),
),
),
使用ElevatedButton
的style
属性
这个不能直接将width
设置成double.infinity
,因为设置之后是没有效果的。
正确的方式是设置一个较大的width
,要大于占满时的宽度。
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromWidth(10000),
),
child: const Text("宽度占满,高度默认(style)"),
),
去掉Button
边距
默认情况下
ElevatedButton
的内容是有边距的。如果不想要这个边距,可以设置下述的方式进行处理。
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
minimumSize: Size.zero,
padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: const Text("去掉Button边距"),
),
Demo
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const SizedBox(height: 3),
ElevatedButton(onPressed: () {}, child: const Text("默认情况下的宽高")),
const SizedBox(height: 3),
SizedBox(
width: 330,
height: 50,
child: ElevatedButton(
onPressed: () {},
child: const Text("设置固定宽高(使用SizeBox)"),
),
),
const SizedBox(height: 3),
ElevatedButton(
onPressed: () {},
style: ButtonStyle(
fixedSize: MaterialStateProperty.all(const Size(330, 50)),
),
child: const Text("设置固定宽高(使用ButtonStyle)"),
),
const SizedBox(height: 3),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size(330, 50),
),
child: const Text("设置固定宽高(使用ElevatedButton.styleFrom)"),
),
const SizedBox(height: 3),
SizedBox(
width: 330,
child: ElevatedButton(
onPressed: () {},
child: const Text("只设置宽度,高度默认(SizeBox)"),
),
),
const SizedBox(height: 3),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromWidth(330),
),
child: const Text("只设置宽度,高度默认(style)"),
),
const SizedBox(height: 3),
SizedBox(
height: 50,
child: ElevatedButton(
onPressed: () {},
child: const Text("只设置高度,宽度默认(SizeBox)"),
),
),
const SizedBox(height: 3),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromHeight(50),
),
child: const Text("只设置高度,宽度默认(style)"),
),
const SizedBox(height: 3),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {},
child: const Text("宽度占满,高度默认(SizeBox)"),
),
),
const SizedBox(height: 3),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size.fromWidth(10000),
),
child: const Text("宽度占满,高度默认(style)"),
),
const SizedBox(height: 3),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
minimumSize: Size.zero,
padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: const Text("去掉Button边距"),
),
],
),
),
),
);
}
}
创作不易,觉得有收获的话点个赞鼓励下呗~
转载自:https://juejin.cn/post/7287914073314983991