Flutterでのextension(拡張関数)の便利な使い方

image

はじめに

今回は、Flutterの拡張関数(extension)のについて説明していきたいと思います。
拡張関数を使いこなすことができれば、コードの書き方の幅がかなり広がりますよ!

拡張関数extensionとは

拡張関数とは・・・あるクラスにメソッドを追加できるものです。
メソッドを追加できるということは、プロジェクト内でよく使うメソッドなどをあらかじめextensionで作っておくことで、あらゆる処理を書くのが楽になります。

以下で、実際に僕がよく使っているextensionの具体例を紹介したいと思います。

extensionを使ってcontextにメソッドを追加する

contextを使って、〇〇する。というケースはかなり多いと思います。
例えば以下のような、

  • Theme.of(context)...

  • MediaQuery.of(context)...
    などです。

  • contextから情報を引っ張ってくる。

  • contextを使って処理をする。
    などcontextを使うものはextensionを使うことで、かなりシンプルなコードにできます。

contextを拡張する具体例

以下のようにcontextを拡張すれば、コードがスッキリすると思います。

import 'package:flutter/material.dart';

extension ContextEx on BuildContext {
  TextTheme get textTheme => Theme.of(this).textTheme;

  ColorScheme get colorTheme => Theme.of(this).colorScheme;

  Size get screenSize => MediaQuery.of(this).size;

  double get screenHeight => MediaQuery.of(this).size.height;

  double get screenWidth => MediaQuery.of(this).size.width;

  ScaffoldFeatureController<SnackBar, SnackBarClosedReason> showSnack(
      SnackBar snackBar) {
    return ScaffoldMessenger.of(this).showSnackBar(snackBar);
  }
}

スクリーンの横幅を取得する部分は、

final screenWidth = MediaQuery.of(context).size.width;

でなく、

final screenWidth = context.screenWidth;

というようにスッキリ書けるようになります。

extensionを使ってenumにメソッドを追加する

enumは条件分岐の際によく使われると思います。
extensionを使ってやることで、こちらもスッキリしたコードになると思います。

enumを拡張する具体例

enumに条件分岐用のメソッド追加する方法は以下の通りです。
この説明では、TestTypeというenumを仮に使用します。

enum TestType { one, two, three }

extension TestTypeEx on TestType {
  bool get isOne => this == TestType.one;

  bool get isTwo => this == TestType.two;

  bool get isThree => this == TestType.three;
}

ここでよくあるケースとして、

void testFunction(TestType testType) {
  if (testType == TestType.one) {
    //...
  } else if (testType == TestType.two) {
    //...
  } else {
    //...
  }
}

上記のような条件分岐がよくあると思います。
enumの名前(ここではTestType)が長いと、コードも冗長となってしまいがちです。
しかし、extensionを使うことで、testTypeの条件式スッキリします。

void testFunction(TestType testType) {
  if (testType.isOne) {
    //...
  } else if (testType.isTwo) {
    //...
  } else {
    //...
  }
}

プロジェクト内に、特定のenumを使った条件式が多いほど効果があると思います。

Flutterでextensionを使う際の注意点

1つだけ注意点があります。
それはimport漏れです。
extensionで拡張したメソッドは、現状コード補完が効いてくれないです。
「拡張したメソッドが候補に出てこない...」ということがあるかもしれないので、拡張関数を書いたファイルをimportできているか確認しましょう。

最後に

いかがでしたか。
Flutterでextensionを使いこなせるようになれば、従来のコードよりもかなりスッキリしたコードが書けるようになると思います。 参考になれば幸いです。

参考

https://dart.dev/guides/language/extension-methods https://qiita.com/YusukeIwaki/items/b866c6ebbbab8859e262

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (110)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (12)可茂IT塾 (8)Firebase (7)riverpod (6)React (6)ChatGPT (5)vscode (5)デザイン (5)新卒 (4)就活 (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)コード生成 (1)GitHub Copilot (1)オンラインオフィス (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)Freezed (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)経験談 (1)フリーランス (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More