見出し画像

FlutterでWidgetのclassを作る方法

Widgetのclassを作成する方法について、自動で作成してくれる機能がAndroid Studioにあったので、メモしておきます。

はじめに

プログラミングの世界では、同じようなコードを何度も繰り返して書くのはスマートとはいえません。

例えば、こんな画面があったとして、似たようなボタンが4つありますよね?

画像1

かといって、似たようなコードを4回書くのはよろしくありません。(それでも動くけどね)

デメリット
・コードが長くなってわかりにくくなる
・デザインを変えようと思った時に、上記のボタンの例だと4回同じ修正をしないといけない

そこで、Widgetのclassを1つ作ってまとめて管理できるようにします。

↓同じようなコードを繰り返している(あまりよくない)

Row(
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
                 Text('これはペンですか?'),
                 SizedBox(
                   width: 20.0,
                 ),
                 ElevatedButton(
                   style: ButtonStyle(
                     backgroundColor:
                         MaterialStateProperty.all<Color>(Colors.green),
                   ),
                   onPressed: null,
                   child: Text(
                     'はい',
                     style: TextStyle(color: Colors.white),
                   ),
                 ),
                 SizedBox(
                   width: 20.0,
                 ),
                 ElevatedButton(
                   style: ButtonStyle(
                     backgroundColor:
                         MaterialStateProperty.all<Color>(Colors.red),
                   ),
                   onPressed: null,
                   child: Text(
                     'いいえ',
                     style: TextStyle(color: Colors.white),
                   ),
                 ),
               ],
             ),

↓シンプル!!!(YesOrNoButtonを作った)

Row(
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
                 Text('これはペンですか?'),
                 SizedBox(
                   width: 20.0,
                 ),
                 YesOrNoButton(
                   buttonColor: Colors.green,
                   buttonText: 'はい',
                   onPressed: null,
                 ),
                 SizedBox(
                   width: 20.0,
                 ),
                 YesOrNoButton(
                   buttonColor: Colors.red,
                   buttonText: 'いいえ',
                   onPressed: null,
                 ),
               ],
             ),

それでは、早速Widgetのclassを作っていきましょう!

①あらかじめ、目的のWidgetを作成しておく

目的のWidgetを作成しておきます。今回は、この部分をclassにします。

画像2

②Flutter Outlineからclassを作成する

Flutter Outlineタブを開く
→目的のWidget(今回はElevated Button)を右クリック
→Extract Widgetをクリック

画像5


適当な名前をつけてRefactorをクリック

画像6


すると、dartファイルの下にclassが自動で作られます。

画像7


※補足
Flutter Outlineを開いても何も表示されないときは、一度Flutter Outlineタブを閉じてから、Terminalに「flutter clean」と入力してから開くと表示されるようになります。

Terminalはこれ↓ Android Studio下のバーから選べます。

画像3


「flutter clean」を入力してEnterキーを押して待つ

ユーザー名@PC名 プロジェクト名 % flutter clean


赤いなみなみがいっぱい出てくるので、「Get dependencies」をクリックして待つ → Flutter Outlineタブを開く→ 開けるようになるはず!

画像4


③パラメータを設定する

変わる可能性のある項目を設定します。今回は、ボタンの色、ボタンのテキスト、押した時の関数をボタンごとに指定したいので、下記のように宣言します。

画像8


次に、コンストラクタを書きます。

画像9

ちなみに、@required をつけると必須項目になります。ボタンは押されないと意味がないので、ここだけ必須にしています。

最後に、buildメソッドの中に宣言した変数を入れてclassは完成です!

画像10


④Widgetを使う

こんな感じで、もともとあるWidgetと同じように使えます。

画像11


まとめ:今回の全コード

今回の全コードはこちら(YesOrNoButtonは別のDartファイルに保存しました)

main.dart

//main.dart

import 'package:flutter/material.dart';
import 'yes_or_no_button.dart';

void main() {
 runApp(MyApp());
}

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     theme: ThemeData(
       primarySwatch: Colors.blue,
     ),
     home: MyHomePage(),
   );
 }
}

class MyHomePage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     body: SafeArea(
       child: Padding(
         padding: const EdgeInsets.all(10.0),
         child: Column(
           children: [
             Row(
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
                 Text('これはペンですか?'),
                 SizedBox(
                   width: 20.0,
                 ),
                 YesOrNoButton(
                   buttonColor: Colors.green,
                   buttonText: 'はい',
                   onPressed: null,
                 ),
                 SizedBox(
                   width: 20.0,
                 ),
                 YesOrNoButton(
                   buttonColor: Colors.red,
                   buttonText: 'いいえ',
                   onPressed: null,
                 ),
               ],
             ),
             Row(
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
                 Text('わたしはけんです。'),
                 SizedBox(
                   width: 20.0,
                 ),
                 YesOrNoButton(
                   buttonColor: Colors.green,
                   buttonText: 'はい',
                   onPressed: null,
                 ),
                 SizedBox(
                   width: 20.0,
                 ),
                 YesOrNoButton(
                   buttonColor: Colors.red,
                   buttonText: 'いいえ',
                   onPressed: null,
                 ),
               ],
             ),
           ],
         ),
       ),
     ),
   );
 }
}

yes_or_no_button.dart

//yes_or_no_button.dart

import 'package:flutter/material.dart';

class YesOrNoButton extends StatelessWidget {
 YesOrNoButton({this.buttonColor, this.buttonText, @required this.onPressed});
 final Color buttonColor;
 final String buttonText;
 final Function onPressed;
 @override
 Widget build(BuildContext context) {
   return ElevatedButton(
     style: ButtonStyle(
       backgroundColor: MaterialStateProperty.all<Color>(buttonColor),
     ),
     onPressed: onPressed,
     child: Text(
       buttonText,
       style: TextStyle(color: Colors.white),
     ),
   );
 }
}


以上、ありがとうございました!

この記事が気に入ったらサポートをしてみませんか?