フラッターでアラートダイアログを表示する方法、値を返す方法、スクロールする方法、余白とボタンの変更方法をまとめました。
基本のアラートダイアログ表示
基本のアラートダイアログ表示です。「ダイアログを表示」ボタンから呼び出される _showAlertDialog() 関数のみを取り出しました。
void _showAlertDialog() { showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), scrollable: true, content: const Text('内容'), actions: <Widget>[ TextButton( child: const Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); }
全体のコード
念のため全体のコードを記載します。この後は、_showAlertDialog() 関数のみを記載します。
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return const MaterialApp( title: 'AlertDialog Demo', home: MyHomePage(title: 'AlertDialog Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { void _showAlertDialog() { showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), scrollable: true, content: const Text('内容'), actions: <Widget>[ TextButton( child: const Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: OutlinedButton( onPressed: _showAlertDialog, child: const Text('ダイアログを表示'), ), ), ); } }
値を返す方法
値を返す方法です。コンソールに、選択したボタンから pop で渡した値が表示されます。
Future<void> _showAlertDialog() async { // 値を返す final answer = await showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), scrollable: true, content: const Text('内容'), actions: <Widget>[ TextButton( child: const Text('No'), onPressed: () { Navigator.of(context).pop('No'); }, ), TextButton( child: const Text('Yes'), onPressed: () { Navigator.of(context).pop('Yes'); }, ), ], ); }, ); // 値をコンソールに出力する print(answer); }
タイトルと内容をスクロール
タイトルと内容をスクロールするアラートダイアログです。内容が少ない場合はアラートダイアログの縦幅が小さくなり、スクロールはしません。
void _showAlertDialog() { // 内容の作成 final list = <Widget>[]; for (var i = 0; i < 20; ++i) { final item = Container(child: Text('内容$i'), color: Colors.lime.shade100); list.add(item); } showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), content: ListBody( children: list, ), actions: <Widget>[ TextButton( child: const Text('Cancel'), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( child: const Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], // タイトルと内容をスクロール scrollable: true, ); }, ); }
内容だけスクロール
内容だけスクロールするアラートダイアログです。内容が少ない場合はアラートダイアログの縦幅が小さくなり、スクロールはしません。
void _showAlertDialog() { // 内容の作成 final list = <Widget>[]; for (var i = 0; i < 20; ++i) { final item = Container(child: Text('内容$i'), color: Colors.lime.shade100); list.add(item); } showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), // 内容だけスクロール content: SingleChildScrollView( child: ListBody( children: list, ), ), actions: <Widget>[ TextButton( child: const Text('Cancel'), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( child: const Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); }
全体をスクロール
全体をスクロールするアラートダイアログです。内容が少ない場合はアラートダイアログの縦幅が小さくなり、スクロールはしません。
void _showAlertDialog() { // 内容の作成 final list = <Widget>[]; for (var i = 0; i < 20; ++i) { final item = Container(child: Text('内容$i'), color: Colors.lime.shade100); list.add(item); } // ボタンの作成 final actions = ButtonBar( children: [ TextButton( child: const Text('Cancel'), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( child: const Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); // 内容にボタンを追加 list.add(actions); showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), content: ListBody( children: list, ), // 内容にボタンを追加した結果、全体をスクロール scrollable: true, ); }, ); }
余白とボタンの変更
余白(パディング)とボタンは変更できます。
void _showAlertDialog() { showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('タイトル'), content: const Text('内容'), // パディングの変更 titlePadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero, // actionsPadding: EdgeInsets.zero, buttonPadding: EdgeInsets.zero, insetPadding: EdgeInsets.zero, actions: <Widget>[ // ボタンの変更 SizedBox( width: MediaQuery.of(context).size.width, child: Row( children: [ Expanded( flex: 1, child: ElevatedButton( child: const Text('Cancel'), onPressed: () { Navigator.of(context).pop(); }, ), ), Expanded( flex: 1, child: ElevatedButton( child: const Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ), ], ), ), ], ); }, ); }
Flutter v2.0.1 で動作確認しています。
コメント