Flutter コンポーネントの基本 ——Button#
Flutter でよく使われる Button にはElevatedButton
、TextButton
、OutlinedButton
があります。以前はRaisedButton
、FlatButton
、OutlineButton
もありましたが、これらは廃止されました。参考:RaisedButton vs ElevatedButton, FlatButton vs TextButton and OutlineButton vs OutlinedButton
TextButton
#
TextButton
は簡単に言うと、クリック可能なText
です。
よく使われる属性は以下の通りです:
- TextButton のよく使われる属性:
- autofocus
- child
- clipBehavior
- enabled
- focusNode
- onLongPress
- onPressed
- style
ここでは、3 つのボタンを定義し、それぞれボタンがクリック不可、クリック可能、グラデーション背景を持つボタンの 3 つの状態を示します。効果は以下の通りです:
使用するコードは以下の通りです:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(
title: const Text(_title),
),
body: const MyStatelessWidget(),
));
}
}
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextButton(
onPressed: null,
child: const Text('無効'),
style: TextButton.styleFrom(
textStyle: const TextStyle(fontSize: 20),
),
),
const SizedBox(
height: 30,
),
TextButton(
onPressed: () {},
child: const Text('有効'),
style: TextButton.styleFrom(
textStyle: const TextStyle(fontSize: 20),
),
),
const SizedBox(
height: 30,
),
ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Stack(
children: [
Positioned.fill(
child: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0xFF0D47A1),
Color(0xFF1976D2),
Color(0xFF42A5F5),
],
),
),
),
),
TextButton(
onPressed: () {},
child: const Text('グラデーション'),
style: TextButton.styleFrom(
padding: const EdgeInsets.all(16.0),
primary: Colors.white,
textStyle: const TextStyle(fontSize: 20),
),
),
],
),
)
],
),
);
}
}
グラデーションボタンの実装に注意してください。Stack
を使用しています。
ElevatedButton
#
- ElevatedButton の属性:
- autofocus
- child
- clipBehavior
- enabled
- focusNode
- key
- onLongPress
- onPressed
- style
コードは以下の通りです:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(
title: const Text(_title),
),
body: const MyStatefulWidget(),
));
}
}
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({Key? key}) : super(key: key);
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
@override
Widget build(BuildContext context) {
final ButtonStyle style =
ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20));
return Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: null,
child: const Text('無効'),
style: style,
),
const SizedBox(
height: 30,
),
ElevatedButton(
onPressed: () {},
child: const Text('有効'),
style: style,
)
],
),
);
}
}
効果は以下の通りです:
OutlinedButton
#
- OutlinedButton の属性は以下の通りです:
- autofocus
- child
- clipBehavior
- enabled
- focusNode
- key
- onLongPress
- onPressed
- style
コードは以下の通りです:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(
title: const Text(_title),
),
body: const Center(
child: MyStatelessWidget(),
),
),
);
}
}
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return OutlinedButton(
onPressed: () {
print('クリックを受け取りました');
},
child: const Text('クリックしてください'));
}
}
スタイルは以下の通りです:
Ps: クリック効果を試してみてください!
各ボタンスタイルの比較:
参考#
Text Button Api Doc
ElevatedButton Api Doc
OutlinedButton Api Doc
RaisedButton vs ElevatedButton, FlatButton vs TextButton and OutlineButton vs OutlinedButton