Flutterは、直感的に美しいモバイルアプリを作成することができる人気のフレームワークです。今回は、Flutterでボタンを押すことで画像が切り替わるシンプルなプログラムを作成する方法を紹介します。これは初心者にとって、Flutterの基本的なウィジェット操作と状態管理を学ぶのに最適な例です。
・ボタンを押すと動作するプログラムを作りたい。
・ボタンの配色を設定する方法を知りたい。
・条件演算子の基礎を学びたい。
こんな疑問を解決します。
・ボタンを押すと動作する簡単なプログラムを作ることができる。
・ボタンを好みのスタイルにアレンジすることができる
・条件演算子の基礎を学ぶことができる
今回は前回の記事に続いて、ボタンに関数を設定し、画像を切り替える方法を紹介します。
また、このプログラムを通じて、Flutterの基本的なウィジェット操作と状態管理を理解するだけでなく、条件演算子(? :
)を使った条件判別の方法についても学ぶことができます。条件演算子は、「三項演算子」とも呼ばれ、条件に基づいて二つの値のうちの一つを選択するシンプルな方法を提供します。
完成するアプリの概要
このアプリでは、画面中央に表示される画像をボタンを押すことで切り替えることができます。また、ボタンのデザイン(色、形状、テキストスタイル)もカスタマイズします。以下がそのプログラム全文です。
下記プログラムでRun(実行)すると、下記のように画像が切り替わるアプリが完成します。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp()); // MyAppアプリを起動する。
}
// StatefulWidgetを使って、アプリの状態が変わる可能性があるウィジェットを作成する。
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key); // コンストラクタでキーを初期化。
@override
_MyAppState createState() => _MyAppState(); // 状態を管理するクラスを生成して返す。
}
// _MyAppStateクラスで、アプリの状態を管理する。
// MyAppウィジェットの状態を保持するクラスです。
class _MyAppState extends State<MyApp> {
// 現在表示している画像のURLを保持する変数。
String imageUrl = 'https://i.imgur.com/372zsV3.jpg';
// 画像を変更する関数。
void _changeImage() {
// setStateを使って、ウィジェットの状態を更新する。
setState(() {
// 画像のURLを切り替える。条件演算子で現在のURLが特定のURLならもう一方のURLに、そうでなければ元のURLに戻す。
imageUrl = imageUrl == 'https://i.imgur.com/372zsV3.jpg'
? 'https://i.imgur.com/TcaEu6j.jpg'
: 'https://i.imgur.com/372zsV3.jpg';
});
}
@override
Widget build(BuildContext context) {
// アプリのUIを構築する関数。
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Test App'), // アプリのタイトルを設定。
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.network(imageUrl), // 現在のimageUrlを使ってネットワークから画像を表示。
ElevatedButton(
onPressed: _changeImage, // ボタンが押された時に画像を変更する関数を呼び出す。
child: const Text(
'Change', // ボタンのテキスト。
style: TextStyle(
fontSize: 20, // テキストのサイズ。
fontWeight: FontWeight.bold, // テキストを太字にする。
color: Colors.amberAccent, // テキストの色。
),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.blue), // ボタンの背景色を青に設定。
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0), // ボタンの角を丸くする。
side: BorderSide(color: const Color.fromARGB(255, 241, 0, 0)), // ボタンの枠線の色を赤に設定。
),
),
padding: MaterialStateProperty.all(EdgeInsets.all(20)), // ボタンの内側の余白を設定。
elevation: MaterialStateProperty.all(5), // ボタンの影の高さを設定。
),
),
const Text('First item'), // 単純なテキストウィジェット。
const Text('Second item'), // 別のテキストウィジェット。
const Text('Third item'), // さらに別のテキストウィジェット。
],
),
),
),
);
}
}
ボタンを押します。画像が次の画像に切り替わります。
プログラムの解説
では今回のプログラムの解説・設定方法を紹介します。
ElevatedButtonの基本
ElevatedButton
を使用して、画面にボタンを表示し、ユーザーがタップしたときにアクションを実行する基本的なコードは以下の通りです。
ElevatedButton(
onPressed: () {
// ボタンをタップしたときに実行されるコード
print("ボタンがタップされました!");
},
child: Text('ボタンのラベル'),
)
onPressed: ボタンがタップされたときに実行される関数を指定します。関数内には、ボタンタップ時に行いたい処理を記述します。今回はプログラムで設定した_changeImageを実行します。
child: ボタン内に表示されるウィジェットを指定します。多くの場合、Text
ウィジェットが使われ、ボタンのラベル(テキスト)を表示します。
ボタンのスタイルをカスタマイズする
ElevatedButtonの見た目は、styleプロパティを通じてカスタマイズすることができます。以下は、背景色、テキスト色、角の丸みをカスタマイズした例です。
ElevatedButton(
onPressed: () {
// ボタンをタップしたときのアクション
},
child: Text('カスタムボタン'),
style: ElevatedButton.styleFrom(
primary: Colors.green, // ボタンの背景色
onPrimary: Colors.white, // ボタンのテキスト色
shape: RoundedRectangleBorder( // ボタンの形状を定義
borderRadius: BorderRadius.circular(20), // 角の丸み
),
),
)
これらの数値やカラーを変えることで自分好みのボタンを作ることができます。
ボタンの形状をさらに詳しく設定する
styleプロパティにButtonStyleウィジェットを使用することで、さらに細かくボタンのスタイルを設定できます。例えば、ボタンの影の高さや、パディングなどを指定できます。
好みに合わせて修正して、hotreloadで見てみましょう。
ElevatedButton(
onPressed: () {
// アクション
},
child: Text('詳細カスタム'),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.purple), // 背景色
elevation: MaterialStateProperty.all(8), // 影の高さ
padding: MaterialStateProperty.all(EdgeInsets.all(16)), // パディング
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25), // 角の丸み
),
),
),
)
好みのボタンを作ってみてください。
画像の表示
Image.networkウィジェットを使って、現在のimageUrlに基づいてネットワーク上の画像を表示しています。ネット上に公開されている2つの画像を表示するように設定します。
条件演算子(? :
)について
条件演算子は以下の形式をとります:
条件式 ? 値1 : 値2;
ここで、条件式
を評価し、それがtrueであれば値1
が結果として選ばれ、falseであれば値2
が選ばれます。この演算子は、簡単な条件に基づいて値を切り替える場合に非常に便利です。
条件演算子(三項演算子)はプログラミングにおいて非常に便利なツールです。この演算子は条件に基づいて2つの値のうちの一つを選択します。ここでは、条件演算子の基本的な使い方を表形式でまとめてみましょう。
構成要素 | 説明 |
---|---|
条件式 | 何らかの条件を評価します。この式がtrue またはfalse を返します。 |
? | 条件式の後に続き、条件式がtrue の場合に実行される値を導入します。 |
真の値 | 条件式がtrue の場合に選択される値です。 |
: | 真の値の後に続き、条件式がfalse の場合に実行される値を導入します。 |
偽の値 | 条件式がfalse の場合に選択される値です。 |
条件演算子の例
条件演算子の使用例を以下に示します。この例では、ユーザーの年齢に基づいて、特定のメッセージを表示します。
int userAge = 18;
String accessMessage = userAge >= 18 ? 'アクセス許可' : 'アクセス拒否';
このコードは、userAgeが18以上の場合は’アクセス許可’を、そうでない場合は’アクセス拒否’をaccessMessageに代入します。
条件演算子の利点
- コンパクトな記述: 簡単な条件に基づいて値を選択する場合、
if-else
文よりも短く書くことができます。 - 直感的な読みやすさ: 条件に基づく値の選択を一行で表現できるため、コードの意図が明確に伝わります。
- 式としての使用: 条件演算子は式の中で使用できるため、変数の初期化や関数の引数として直接使うことができます。
条件演算子は、プログラミングの多くの場面で役立つツールです。しかし、複雑な条件や多数の選択肢がある場合には、コードの可読性を保つためにif-else
文を使用する方が適切な場合もあります。
プログラム内での使用例
プログラム内では、画像のURLを切り替えるために条件演算子を使用しています。
imageUrl = imageUrl == 'https://i.imgur.com/372zsV3.jpg'
? 'https://i.imgur.com/TcaEu6j.jpg'
: 'https://i.imgur.com/372zsV3.jpg';
このコードでは、imageUrlが特定のURL(’https://i.imgur.com/372zsV3.jpg’)と等しいかどうかを評価しています。もし等しい場合(条件式がtrueの場合)、imageUrlに新しいURL(’https://i.imgur.com/TcaEu6j.jpg’)を設定します。等しくない場合(条件式がfalseの場合)、imageUrlに元のURLを再設定します。このようにして、ボタンが押されるたびに画像が切り替わります。
初心者へのアドバイス
条件演算子は非常に便利ですが、複雑な条件や多くの選択肢がある場合には、if-else文の方が可読性が高くなることがあります。しかし、簡単な二択の条件判断では、条件演算子を使うことでコードを短く明瞭に保つことができます。
この例を通して、FlutterでのUI構築の基本、状態管理、そして条件判断の基本的な方法について理解を深めることができるでしょう。プログラミングは実践を通じて学ぶことが多いので、ぜひこのコードを実際に書いてみて、動作を確認しながら学んでください。