そういえば、最近Flutterってどうなったの？

# はじめに

この記事は[NTTコムウェア Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nttcomware) 3日目の記事です。

NTTコムウェアの掛内です。
最近は、[IPAのDSSを活用したエンジニアの育成及び組織文化の醸成](https://www.ipa.go.jp/jinzai/skill-standard/dss/case.html#nttcomware)などをやらせて頂いております。

本記事では、タイトルの通りなのですが、最近Flutterの動向についてまとめていきたいと思います。

と、いいますのも、昨年度「[動かして学ぶ！Flutter開発入門](https://www.shoeisha.co.jp/book/detail/9784798177366)」を執筆させて頂いたのですが、その後情報を全然キャッチアップできておらず、記事執筆を理由に棚卸しをしようと思った次第です。

# そもそもFlutterって？
Flutterとは、2017年にGoogleが発表したオープンソースのマルチプラットフォームの開発フレームワークです。

Flutterはマルチプラットフォームなので、Android/iOS/Web/Windows/macOS/Linuxの6つのアプリを全く同じソースコードで開発できます。

Flutter1では、モバイル(AndroidとiOS)のみが対象だったのですが、2021年のFlutter2でWebアプリ、2022年のFlutter3でWindows/macOS/Linuxのデスクトップアプリに正式対応し、モバイル以外のプラットフォームのアプリも同一のソースコードで開発できるようになりました。

特に、AndroidとiOSのアプリを同じソースコードで開発できる点が魅力的で、両方の開発環境を準備する必要がなく、プログラミング言語もFlutter(Dart)のみ習熟すれば良いというのが、Flutterが人気の理由の一つです。
また、FlutterがGoogle製ということもあり、Firebaseなどのクラウドサービスと相性が良い点も特徴です。


# Flutter近況キャッチアップ
## バージョンアップ
最後のメジャーバージョンアップは、2022/5/12のFlutter3.0となっており、その後は、マイナーバージョンアップになっています。

## Flutterの今後の噂

まず、三次情報として、インターネット上で、Flutterの今後について考察している記事を覗いてみると、Flutterは今後伸びるという人とオワコンという人がかなり入り乱れているように見受けられます。

代表的な意見を整理してみると、以下のようになっています。

* 伸びる派の意見
    * Android/iOS/Webアプリを同時に作れるのは大きい
    * 学習コストが小さい
    * Googleが開発元
    * 活動やイベントがまたまだアクティブ
    * Firebaseと連携しやすい
* オワコン派の意見
    * メジャーアップデートがない
    * ライブラリやツールが少ない
    * 人材やシーンが限定的
    * プラットフォーム固有の機能やトラブルへ対応しづらい
    * 日本語ドキュメントが少ない(これで困るのは日本だけの問題ですが)

## Trends
続いて、Google Treandsで、キーワードのトレンドを調べてみました。これだけでは一概に流行り廃りは判断できませんが、横ばいであることから一定の人気は継続しているとはいえそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/16b6ac5d-e758-c243-83c8-cf6822330392.png)

[GitHub](https://github.com/flutter/flutter)のスター数は167k（2024/11/25 時点）で、インサイトのコミット数などを見ても、日に20回ぐらいのコミットは行われており、活動自体もまだまだアクティブと言えそうです。

逆に、GoogleがAIに重点をおいたことで、Flutterの開発が手薄になっているなどのコメントもあり、それが原因で[プロジェクトをFork](https://flutterfoundation.dev/blog/posts/we-are-forking-flutter-this-is-why/)したなどの活動もあります。

参考までに、拙書のベースとなった[ZennのFlutter実践入門](https://zenn.dev/kazutxt/books/flutter_practice_introduction)の売上/アクセス解析をしてみると、確かにリリース当初から比べると減少傾向にはありますが、1年以上前の情報になっていることを考えると、比較的コンスタントにご利用頂いているようにも見受けられます。


## Conference/Event
次に、2024年に行われたカンファレンスやイベントをChatGPTに聞いて確証が取れたものを整理してみます。

* 2024/2 [Flutter Heroes 2024](https://flutterheroes.com/2024/)
* 2024/2 [Flutter Global Summit](https://events.geekle.us/flutter24/)
* 2024/4 [Flutter Connection Conference](https://flutterconnection.io/)
* 2024/7 [FlutterCon Europe 2024](https://fluttercon.dev/)
* 2024/9 [FlutterCon USA 2024](https://flutterconusa.dev/)

これ以外にももちろんたくさんあります。世界規模なイベントは概ね2ヶ月に1回ぐらいのペースであったようで、Google I/Oでも毎年Flutterは触れられています。

日本でも[FlutterKaigi2024](https://2024.flutterkaigi.jp/)などが開催されています。

上記のイベントの一部は、2025年も計画されています。
* 2025/2 [Flutter Heroes 2025](https://flutterheroes.com/2025/)
* 2025/7 [FlutterCon Europe 2025](https://fluttercon.dev/)

カンファレンスやイベントの開催頻度と規模からは、衰えはあまりないように見えます。

## ChangeLog
最後に、最近どんな機能が追加されたか見ていきます。

メジャーバージョンアップは2024/11時点で行われていませんが、複数のマイナーバージョンアップが行われているので、変更点を3.0から順に追いかけていきたいと思います。

[公式のリリースノート](https://docs.flutter.dev/release/release-notes)のお知らせを参考に、主要な機能追加の情報をキャッチアップしていきます。
なお、概ね3ヶ月から半年ごとに、バージョンが上がっている模様です。

### バージョンアップの総括
ImpellerとMaterial Design 3とDevToolsの改善や対応が主だった内容のように思います。
もちろん、SLSA/WebAssembly/Swift Package Manager/カジュアルFlutterゲームの対応や高度化などもありましたが、マイナーバージョンアップということもあり、そこまで劇的には変わっていない印象です。
各バージョンアップのリリースノートを一つずつ見ていきます。

### 3.3.0 (2022/8/31)
* リファレンスアプリ Wonderousのリリース
* レンダリングエンジン Impellerのリリース
* Material Design 3のサポート
* Scribble機能の追加
* ルーティングパッケージ(go_routerパッケージ)の追加

後々改良が加えられていくImpellerがリリースされたバージョンで、今となっては当たり前のMaterial Design 3もサポートが始まったバージョンです。
Impellerは[説明用のページ](https://docs.flutter.dev/perf/impeller)も準備されているようです。

### 3.7.0 (2023/1/25)
* Material Design 3の大幅サポート強化
* メニューバーとカスケードメニューの対応
* カスタムコンテキストメニューの対応
* テキスト顕微鏡
* 国際化(gen-l10n)の刷新
* DevTools のアップデート

メニューバー、カスケードメニュー、カスタムコンテキスト、テキスト顕微鏡など、UIにも絡む機能面のウィジェットがいくつも追加され、DevToolsでは、スナップショットだけではなく2点間のDiffが取れるようになったりと機能が高度化しました。

### 3.10.0 (2023/5/11)
* Material Design 3の準拠とデフォルト化
* Supply Chain Levels for Software Artifacts ( SLSA ) Lv1準拠
* Webの軽量化/高速化

最初のMaterial Design 3にまとめられていますが、詳細を見ると様々なコンポーネントのUIが変わっているようです。
また、SLSA対応でアプリの改ざん防止などのセキュリティ/コンプライアンス対応もされているようです。

### 3.13.0 (2023/8/17)
* Material Design 3及びImpellerの改善
* 折りたたみデバイスへの対応
* [カジュアルFlutterゲーム](https://flutter.dev/games)のリソース/ツールキットのアップデート

Material Design 3及びImpellerの改善には多くの紙幅が費やされており、高い関心ごとであることが伺えます。
それ以外では、折りたたみデバイスへの対応やFlutterゲームについてが言及されています。

### 3.16.0 (2023/11/16)
* Material Design 3及びImpellerの改善
* カジュアルFlutterゲームのメジャーバージョンアップ

このリリースでも前回のリリースと同様に、Material Design 3、Impeller、カジュアルFlutterGameツールキットの3点に注力したアップデートとなっていました。

### 3.19.0 (2024/2/16)
* Impeller及びDevToolsの改善
* Gemini Google AI Dart SDK ベータ版リリース
* Windows Arm64サポート

Gemini対応、Arm64サポートと新しいものへの追従が見られたバージョンアップでした。

### 3.22.0 (2024/5/14)
* WebAssembly対応
* Impeller及びDevToolsの改善

今回の目玉は、WebAssembly対応でした。
ImplellerもAndroidでバックエンド機能が完成という表現が使われるほど、大幅に改善が行われたようです。

### 3.24.0 (2024/8/7)
* いくつかのウィジェットの追加と改善
* Impeller及びDevToolsの改善
* GPU APIのプレビュー
* 動画広告のサポート
* Swift Package Manager

今回は、ウィジェットや性能の改善が主だったところだったようです。
SwiftPackageManagerが導入されたことで、CocopadやRubyを使わなくても良くなり、Swiftのパッケージが使えるようになるとのことです。



# (寄り道) Geminiを試してみる
机上調査だけだとつまらないので、久しぶりにコードを書いて、新しい機能を試してみたいと思います。
途中出てきた、Geminiについて動かしてみました。

APIを払い出して、Webアプリとして必要最低限で動かしています。
返答は長すぎる傾向があったので、質問文に「なお、200文字程度で答えてください」とだけ付け足し、プロンプトエンジニアリングは実質行っていません。

```dart:main.dart
import 'package:flutter/material.dart';
import 'package:google_generative_ai/google_generative_ai.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Gemini Chat',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Gemini Chat'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _geminiResponse = "問い合わせ待ち";
  String _question = "";
  final model = GenerativeModel(model: 'gemini-1.5-flash-latest', apiKey: 'XXXXXXXXXX'); // APIKEYはマスキング

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            TextFormField(
              decoration:const InputDecoration(labelText:"質問文の入力"),
              onChanged: (value) => _question = value,
            ),
            Text(
              _geminiResponse,
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){
        final content = [Content.text("$_question\nなお、200文字程度で答えてください")];
        model.generateContent(content).then((response){
            setState((){
                _geminiResponse = response.text??'Error';
            });
        });
        },
        child: const Icon(Icons.send),
      ),
    );
  }
}

```

問い合わせに関する部分は下記になりますが、特段複雑なことはしていません。
```dart:main.dart(抜粋)
// モデル名とAPIキーを指定して、モデルを作成します
final model = GenerativeModel(model: 'gemini-1.5-flash-latest', apiKey:{払い出したAPIキー});

// 質問する内容を作成します
final content = [Content.text( {問い合わせ文} )];

// モデルに質問を投げて受け取ります
// もちろんawaitで同期処理をしても大丈夫です
model.generateContent(content).then((response){ {reponse.textに回答が入っている} });
```

せっかくなので、Flutterの将来性について聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/c0656343-3da3-cb69-e34f-c9735e9a19d2.png)

ついでに、弊社NTTコムウェアについて聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/995d960e-013f-2166-eb09-faf9f1d92a8f.png)

:::note warn
回答内容は100%正しい保証はありませんので、動作確認の参考程度である点にご留意ください。
:::

# まとめ
* 良くも悪くも1,2年Flutterに劇的な変化は起きていないようです。
    * 良い意味では、人気は失われておらず競合も登場していない。
    * 悪い意味では、新たなユースケースやニーズを掘り起こすほどの機能追加もない。
* 実利的にクロスプラットフォームの最有力の候補であるのは、ここ数年変わっておらず、Flutterのアプリは着実に増えており、星の数ほど、プログラミング言語/フレームワーク/技術要素が生まれては消えていくこのご時世に置いては、十分市民権を会得したように思います。
* メジャーバージョンアップや分かりやすい起爆剤は、確かにほしいです。

記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。