ブログ

  • Flutter Flameの調査リンク集

    Flutter Flameの調査リンク集

    ゲームエンジンFlameについて調べた主に海外サイトのリンク備忘録です
    触ってみた感じ面白いのでゲームつくってみようと思います!!

    公式系

    Flame Engine公式サイト
    https://flame-engine.org/

    ブロック崩しゲームを作るCodelabs
    https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker?hl=ja#0

    Forge2D物理エンジンを使ったゲーム開発Codelabs
    https://codelabs.developers.google.com/codelabs/flutter-flame-forge2d?hl=ja#0

    Flutter公式のゲームツールキット
    https://docs.flutter.dev/resources/games-toolkit?_gl=1glckmp_upMQ.._gaMTQ2MTg4NzMwMy4xNzYwMzk5MzUy_ga_04YGWK0175*czE3NjAzOTkzNTEkbzEkZzAkdDE3NjAzOTkzNTEkajYwJGwwJGgw

    Flutter公式ゲーム開発ページ
    https://flutter.dev/games

    Very Good Ventures

    Very Good Venturesの記事が結構出てきた

    I/O Pinball FlutterとFirebaseで作られたゲーム事例
    https://blog.flutter.dev/i-o-pinball-powered-by-flutter-and-firebase-d22423f3f5d

    BlocとFlameを使ったFlutterゲーム開発
    https://www.verygood.ventures/blog/flutter-games-with-bloc-and-flame?utm_source
    上の記事は個人的に気になってる

    Very Good Venturesの新しいゲームテンプレート
    https://www.verygood.ventures/blog/generate-a-game-with-our-new-template
    BLoCが標準で入ってるテンプレート

    個人とか他

    Flameでエアホッケーゲームをゼロから作る
    https://maxim-gorin.medium.com/building-a-2d-game-in-flutter-with-flame-air-hockey-from-scratch-26b87a05a7e7

    Codemagic Flutterでのゲーム開発ガイド
    https://blog.codemagic.io/flutter-flame-game-development/?utm_source

    Flameフレームワークでのゲーム開発入門
    https://genieee.com/flutter-game-development-flame-framework/?utm_source

    Reddit Flameでのゲーム開発体験談
    https://www.reddit.com/r/FlutterDev/comments/1i9kcbz/flutter_flame_my_game_development_experience/?utm_source

    Flame Engine用MCPサーバーの構築
    https://dev.to/salihgueler/how-i-built-a-flame-engine-mcp-server-to-build-flutter-games-3ea2?utm_source

    Flameエンジンでゲーム開発の可能性を引き出す
    https://www.velotio.com/engineering-blog/flame-engine-unleashing-flutters-game-development-potential?utm_source
    これやりたいスプライト作成したキャラを十字キーで動かせるサンプル

    ゲーム開発でのFlutter活用についてのネット調査
    https://medium.com/easy-flutter/flutter-for-game-development-what-internet-research-reveals-a1611952029b

    ゲーム開発ツールとしてのFlutter早期採用者の視点
    https://blog.flutter.dev/perspectives-from-early-adopters-of-flutter-as-a-game-development-tool-f95fb3406d51

    Flutter Flame vs Unity vs Godotのベンチマーク
    https://filiph.net/text/benchmarking-flutter-flame-unity-godot.html?utm_source

    Flutterゲームエンジンの比較
    https://blog.logrocket.com/comparing-flutter-game-engines/?utm_source

    Flame Engineでのスプライトシートを使った高度なアニメーション
    https://medium.com/kbtg-life/advanced-animation-with-flutter-flame-engine-ep-1-sprite-sheet-24fb45e888cc

    Flutterゲーム開発の基礎
    https://medium.com/@hamber/flutter-game-development-33a0fd56a89c

    FlutterとFlameで2Dトップダウン RPGを作る
    https://medium.com/@limcheekeen.63/building-a-2d-top-down-rpg-with-flutter-and-flame-9facebb9b0f9

    Flutter Flame + Tiled ストラテジーゲームのフィールドプロトタイプ
    https://al-e-shevelev.medium.com/flutter-flame-tiled-a-simple-game-field-prototype-for-a-strategy-game-46518d9c3adc

    おわりに

    普段使ってるFlutterとVScodeつくれるのが個人的には良さげ

    youtubeでもチュートリアルみたいなの結構あった‼︎

  • Codex vs Gemini CLI Flutter extension 同じプロンプトでFlutterアプリを作らせて比較してみた

    Codex vs Gemini CLI Flutter extension 同じプロンプトでFlutterアプリを作らせて比較してみた

    Flutter Extension for Gemini CLIが発表されていたので、
    https://blog.flutter.dev/meet-the-flutter-extension-for-gemini-cli-f8be3643eaad
    同じプロンプトを与えてドメインと画像制限ブラウザアプリを作らせて比較してみる実験をやってみた。

    作りたいブラウザアプリの機能

    • 設定画面で制限するドメインを決める
    • そのドメインにアクセスするには、なぜ使用するのかを明記して30秒待たなければいけない
    • ブラウザに画像、動画を表示させないモード設定
    • ブラウザ画面がカラーフィルターでグレーアウトを調整できる設定

    Gemini CLIの準備

    GoogleがFlutter作ってるからいい感じになるか?と期待して試してみた。

    Gemini CLIのインストール

    https://github.com/google-gemini/gemini-cli

    brew install gemini-cli

    /planモードのカスタムコマンド追加

    参考

    Flutter extensionのインストール

    gemini extensions install https://github.com/gemini-cli-extensions/flutter.git

    GeminiにMCP追加

    とりあえずserenaとdartを追加

    {
      "ide": {
        "enabled": true,
        "hasSeenNudge": true
      },
      "security": {
        "auth": {
          "selectedType": "oauth-personal"
        }
      },
      "mcpServers": {
        "dart": {
          "command": "dart",
          "args": [
            "mcp-server"
          ]
        },
        "serena": {
          "command": "uvx",
          "args": [
            "--from", "git+https://github.com/oraios/serena",
            "serena-mcp-server",
            "--context", "ide-assistant",
            "--enable-web-dashboard", "false",
            "--project", "${PWD}"
          ]
        }
      }
    }
    mcp確認

    プロンプトの準備

    以下のプロンプトを書いたファイルを読み込みアプリ実装計画を立てる

    • yoken.md
    • business.md
    • flutter_rule.md

    GeminiはFlutter extensionの/create-appコマンドを使って実行した。

    結果比較

    Codex (gpt-5-codex high)

    エージェントモードで試したときは手直しなしでいい感じに動いた。

    できたもの

    • グレーアウト機能 ✅ 動作OK
    • 画像制限機能 ✅ 動作OK
    • ドメイン制限機能 ⚠️ YouTubeに解除してるのにアクセスできなかったりして完璧ではないけど、おおむね動く(これはflutter_inappwebviewではサポートしきれないかも)

    Gemini CLI

    実装中にパッケージの依存関係が解決できず手直しが必要だった。

    できたもの

    • 設定画面、ダッシュボード画面から戻れない
    • 設定画面に遷移するとエラー
    • ドメインを制限する機能もちょっと要件と違う実装になってた(理由を入力する状態から30秒カウントを開始していた)

    まとめ

    同じプロンプトでも結果は結構違った。Codexの方が手直しなしで動くものができた印象。Gemini CLIはFlutter専用の拡張があるものの、依存関係の解決やUI周りでつまづいた。

  • FlutterでLiveKitを使ってみた

    FlutterでLiveKitを使ってみた

    Flutterでターン制ボイス人狼アプリつくれるかな?課金の処理とかも楽そうだし
    と思いlivekitの調査したのでメモ

    LiveKitの動かし方

    この記事を書いた時点では
    LiveKitを動かすには

    • ローカル
    • 自前のバックエンド
    • LiveKitクラウド(たしか月に10-20時間くらい無料枠ある)

    上記3つのどれかで使用する必要がある

    トークン発行

    さらにLiveKitにアクセスするためにトークンも発行が必要で調べた限り

    • ローカルは自分でコマンド叩いて発行できる
    • バックエンドの処理で発行
    • Firebase functionsでLiveKitクラウドから発行する方法がある

    Firebase functions使う場合は従量課金のプランに入る必要があった(ためすだけなら無料の範囲だったはず)

    動作確認

    自分が試したのはローカルとLiveKitクラウドでiOSのシュミレーターと実機で動作確認した

    リファレンス

    https://docs.livekit.io/home

    Flutterのもあるけどこれをやるまえにlivekitを動かす環境構築が必要

    https://docs.livekit.io/agents/start/voice-ai

    https://docs.livekit.io/home/quickstarts/flutter

    サンプルリポジトリ

    ローカルでlivekitを起動させて通話サンプルリポジトリ(iOSだけシュミレーターと実機で動作確認した)

    https://github.com/kabikira/base_sample/tree/codex/create-flutter-project-with-livekit-voice-call

    livekitクラウドでFirebase functionsでトークン取得を使ったリポジトリ

    https://github.com/kabikira/sample_voice_chat/tree/develop

    リファレンスの参考になるとこ抜粋

    トークン/認証の仕組み(JWTに権限やroomが入る)

    https://docs.livekit.io/home/get-started/authentication

    トークンの作り方(バックエンドで発行しフロントへ渡す)

    https://docs.livekit.io/home/server/generating-tokens

    付与できる権限(VideoGrant: canPublish / canSubscribe / canPublishData / room / roomJoin など)

    JS Server SDK(VideoGrantのプロパティ一覧)
    https://docs.livekit.io/reference/server-sdk-js/interfaces/videogrant.html

    Python Server SDK(access_token内のgrants一覧)
    https://docs.livekit.io/reference/python/v1/livekit/api/access_token.html

    接続時の考え方(参加者は音声/映像/データを公開できる)

    https://docs.livekit.io/home/client/connect

    テキスト送受信の方法(音声と同じRoomでテキストも可能)

    Realtime text & data(全体)
    https://docs.livekit.io/home/client/data/

    Text streams(チャットやLLMレスポンス向けの高レベルAPI)
    https://docs.livekit.io/home/client/data/text-streams/

    Flutterでのデータ送信(publishData)
    https://docs.livekit.io/reference/client-sdk-flutter/livekit_client/LocalParticipant/publishData.html

    Flutterでのデータ受信(DataReceivedEvent)
    https://docs.livekit.io/reference/client-sdk-flutter/livekit_client/DataReceivedEvent-class.html

    運用上の補足(トークンは短いTTL推奨・発行後はリボーク不可)

    Managing participants(TTLを短くする推奨など)
    https://docs.livekit.io/home/server/managing-participants/

  • [Flutter] Golden Test でGIFのフレームを指定してPNGに変換してテスト可能にする

    [Flutter] Golden Test でGIFのフレームを指定してPNGに変換してテスト可能にする

    訂正(2025-10-08)
    当初は precacheImages をカスタムして GIF を PNG に変換していましたが、
    テスト時に AssetBundle を差し替える方法(下記コード)に修正しました。
    理由:GIFのフレームを進めてもゴールデンテストで生成される画像には最初のフレームしか反映されていなかったため

    FlutterのゴールデンテストでGIFを含む画面のとき、テストが終了しなくなる問題に遭遇しました。
    GIFのフレームを指定してPNGに変換して解決したのでまとめます。

    環境

    • Flutter 3.35.5, on macOS 15.4
    • alchemistパッケージを使用しGoldenTest実施

    サンプルリポジトリ:
    https://github.com/kabikira/golden_test_sample/tree/feature/add_find

    ビルドするとPNG(上)とGIF(下)が表示されるプロジェクト

    問題の発端

    • GIF画像の Image.asset('assets/images/Tesseract.gif') を含むViewをAlchemistでゴールデンテストすると、flutter test widget_golden_test.dart --update-goldensflutter test widget_golden_test.dart が完了しない。
    • コンソールにはエラーは出でない。
    • アセットパスの設定(pubspec.yamlassets:)は正しく、PNGの表示は問題ない。

    原因調査

    1. flutter test widget_golden_test.dart 実行時デバッガーを止めながら確認すると precacheImageawait Future.wait(images); で待ち続けている。
    2. Alchemistの precacheImages 実装を確認。
    • pumpBeforeTest: precacheImages がデフォルトで使われ、Image / FadeInImage / DecoratedBox の画像をまとめて precacheImage している。
    • await Future.wait(images); で読み込み完了を待つため、GIFのアニメーションが続く限り処理が進まないみたい。
    1. テスト実行時検証。
    • GIFを含まない、画像生成とテストは即終了する。
    • GIFがある場合のみ Future.wait が解決しないため10分経つとタイムアウト(command timed out)が発生。

    解決策(正しい実装):テスト時に AssetBundle を差し替えて GIF→PNG 化

    AssetBundle ラッパー

    import 'dart:typed_data';
    import 'package:flutter/services.dart';
    import 'package:image/image.dart' as img;
    
    /// GIFアセットを単一フレームPNGへ変換して返すAssetBundleラッパー。
    class TestGifToPngAssetBundle extends CachingAssetBundle {
      TestGifToPngAssetBundle(this._parent);
    
      final AssetBundle _parent;
    
      @override
      Future<ByteData> load(String key) async {
        // GIF以外はそのまま親に委譲
        if (!key.toLowerCase().endsWith('.gif')) {
          return _parent.load(key);
        }
    
        // GIFの最初のフレームを指定して変換
        final gifData = await _parent.load(key);
        final frame = img.decodeGif(gifData.buffer.asUint8List(), frame: 3);
    
        if (frame == null) {
          return gifData;
        }
    
        final pngBytes = Uint8List.fromList(img.encodePng(frame));
        return ByteData.sublistView(pngBytes);
      }
    }
    

    ゴールデンテストで差し替える

    import 'package:alchemist/alchemist.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:flutter_test/flutter_test.dart';
    import 'package:golden_test_sample/main.dart';
    
    import 'support/alchemist/golden_test_device_scenario.dart';
    import 'support/test_gif_to_png_asset_bundle.dart';
    
    void main() {
      group('MyApp Golden Test', () {
        Widget buildMyApp() {
          return const MainApp();
        }
    
        final device = Device.phonePortrait;
    
        goldenTest(
          'Default',
          fileName: 'my_app_default',
          pumpBeforeTest: precacheImages,
          builder: () {
            final children = <Widget>[];
    
            children.add(
              GoldenTestDeviceScenario(
                name: device.name,
                device: device,
                builder: () => buildMyApp(),
              ),
            );
    
            return DefaultAssetBundle(
              bundle: TestGifToPngAssetBundle(rootBundle),
              child: GoldenTestGroup(children: children),
            );
          },
        );
      });
    }
    

    これで 画像読み込み段階指定したフレームで GIF → PNG 化され、
    precacheImage / Future.wait の待機問題に依存せずテストが完了します。

    fram指定0のとき

    fram指定3のとき


    検証

    • flutter test test/widget_golden_test.dart --update-goldens を実行すると、GIFを含む画面も画像生成完了。
    • CIゴールデン(test/goldens/ci/my_app_default.png)とmacOSゴールデン(test/goldens/macos/my_app_default.png)が生成され、差分も期待通り。
    • flutter test test/widget_golden_test.dart でのテストも成功。
    • フレームを指定してのテスト成功


    参考

    ヒント得たページ


    変更履歴

    • 2025-10-08:テスト時の GIF → PNG 変換を AssetBundle ラッパー方式に訂正。
    • 2025-10-05:リンクと例を更新。

    学習ログ(旧アプローチ:precacheImages をカスタムする方式)

    クリックして展開(旧実装の考え方とコード断片)

    当初は pumpBeforeTest: precacheImages をカスタムして、precacheImage に渡していました。

    Future<void> customPrecacheImages(WidgetTester tester) async {
      await tester.runAsync(() async {
        final images = <Future<void>>[];
        for (final element in find.byType(Image).evaluate()) {
          final widget = element.widget as Image;
          images.add(_precacheWithGifFrame(widget.image, element));
        }
        for (final element in find.byType(FadeInImage).evaluate()) {
          final widget = element.widget as FadeInImage;
          images.add(_precacheWithGifFrame(widget.image, element));
        }
        for (final element in find.byType(DecoratedBox).evaluate()) {
          final widget = element.widget as DecoratedBox;
          final decoration = widget.decoration;
          if (decoration is BoxDecoration && decoration.image != null) {
            images.add(_precacheWithGifFrame(decoration.image!.image, element));
          }
        }
        await Future.wait(images);
      });
      await tester.pumpAndSettle();
    }
    
    Future<void> _precacheWithGifFrame(
      ImageProvider<Object> provider,
      Element element,
    ) async {
      if (provider is AssetImage &&
          provider.assetName.toLowerCase().endsWith('.gif')) {
        final configuration = createLocalImageConfiguration(element);
        final key = await provider.obtainKey(configuration);
        final pngBytes = await _gifFrameToPng(key, frameIndex: 0);
        final memoryImage = MemoryImage(pngBytes, scale: key.scale);
        await precacheImage(memoryImage, element);
        return;
      }
      await precacheImage(provider, element);
    }
    
    Future<Uint8List> _gifFrameToPng(
      AssetBundleImageKey key, {
      required int frameIndex,
    }) async {
      final bundle = key.bundle;
      final data = await bundle.load(key.name);
      final frame = img.decodeGif(data.buffer.asUint8List(), frame: frameIndex);
      if (frame == null) {
        throw StateError('フレームを取得できませんでした: ${key.name} (frame: $frameIndex)');
      }
      return Uint8List.fromList(img.encodePng(frame, singleFrame: true));
    }

  • 解決[Using .fvmrc in /Users/…] FVM が常にホームの .fvmrc を使ってしまう問題を解消

    解決[Using .fvmrc in /Users/…] FVM が常にホームの .fvmrc を使ってしまう問題を解消

    このブログで解決できること

    • fvm use を実行してもプロジェクト直下に .fvmrc が生成されず、常に Using .fvmrc in /Users/xxx と表示される問題の原因を理解できます。
    • グローバル設定に残った .fvmrc を削除し、プロジェクト単位で Flutter SDK を切り替える手順。
    • Homebrew 版 FVM のアンインストールと再セットアップ。

    環境メモ

    • macOS 15.4 (Apple Silicon)
    • Homebrew で FVM 3.2.1 をインストールしていた
    • Flutter プロジェクト: sample

    発端

    sample ディレクトリで fvm use stable を実行すると、毎回次のように表示されてしまう状態でした。

    Using .fvmrc in /Users/kabikira
    Skipping "pub get" because no pubspec.yaml found.

    プロジェクト直下に .fvm/.fvmrc が作られず、ホーム直下の設定が優先されるため、他プロジェクトとバージョンを切り替えられないのが悩みでした。

    調査

    1. ホーム直下に ~/.fvmrc~/.fvm/ が存在しており、グローバル設定が機能していた。
    2. さらに ~/Library/Application Support/fvm/.fvmrc も残っており、FVM 3.x の “global config” が別の場所でも効いていた。
    3. fvm doctor が「Directory: /Users/kabikira」を指すなど、FVM がプロジェクトを正しく認識していない挙動が確認できた。
    4. グローバル設定を削除しても、fvm use 実行時に再生成されるケースがあり、Homebrew 版の FVM を一旦アンインストールしてクリーンにする必要が出てきた。

    原因

    以前ホームディレクトリで FVM の操作(fvm use や fvm global など)をテキトーに行ってしまったことで、ホーム直下や ~/Library/Application Support/fvm/ にグローバル設定の .fvmrc が作成されていました。

    そのファイルが残っている限り、FVM は各プロジェクトで fvm use … を実行してもグローバル側を優先してしまい、ホームの .fvmrc を読み続ける状態になっていました。

    実際に行った対処

    1. FVM の再インストール準備

    brew uninstall fvm

    Home ディレクトリに残っていた .fvm キャッシュや ~/fvm/versions も削除しました。
    Homebrew で FVM を入れ直そうとしたところ、Command Line Tools が古くてエラーがでましたが、ターミナルに表示されている以下コマンドで解決

    sudo rm -rf /Library/Developer/CommandLineTools && sudo xcode-select --install

    3. FVM の再導入とプロジェクトごとの設定

    ターミナル再起動してbrew install fvm で再導入。

    brew install fvm 


    各プロジェクトで以下を実行し、個別の SDK がセットされることを確認。

    cd /path/to/project
    fvm use 3.35.5

    sample 内で fvm use 3.35.5 を再実行すると、今度はプロジェクト専用の設定として SDK ダウンロードとセットアップが完了。

    .fvm/ 配下に flutter_sdk のリンクが作られ、fvm doctor も正しいディレクトリを指すようになりました。
    これで他の Flutter プロジェクトでも同じ手順を踏むだけで、バージョンを個別に管理できます。

    以上の流れで、FVM を使った Flutter SDK のプロジェクト単位管理を再構築できました。同じ症状で悩んでいる方の参考になれば幸いです。

    追記: FVM の運用メモ

    • fvm releases どのFlutterバージョンが使えるのか、最新のstable更新されたかを確認できる。
    • fvm use 3.35.5 は Flutter 3.35.5 を固定する指定。チーム全員で同じバージョンを使うならこの形式がおすすめ。
    • fvm use stable は Stable チャンネルの最新版を追従する指定。最新版を常に使いたい場合に便利だが、プロジェクトによってはバージョンが揃わないので注意。固定したい場合は fvm use stable --pin を使ってその時点の Stable を固定できる。
    • .fvmrc はプロジェクトごとに同じ Flutter バージョンを共有するための設定ファイル。コミットしておくと便利。
    • .vscode/settings.json は VS Code のワークスペース設定。チームで共有したい設定だけを残してコミットする運用が良い。

    参考

    https://fvm.app
    https://zenn.dev/altiveinc/articles/flutter-version-management-3

  • 【2025年】Flutter初心者 おすすめ学習ロードマップ

    【2025年】Flutter初心者 おすすめ学習ロードマップ

    まず初めに、プログラミングの基礎知識はあるけど、Flutterは初めてという方に向けて、自分2025年に実務でFlutterを扱うにあたり、実際に辿った学習ルートを振り返りながら、効率的な学習方法をまとめました。

    たとえば、こんな人におすすめ

    • 他のプログラミング言語の経験がある
    • Flutterでアプリ開発を始めたい
    • 何から手をつければいいか迷っている

    学習ロードマップ

    ステップ1 ルビーDogさんのFlutter入門

    学べる内容

    • 環境構築の手順
    • Widgetの基本的な使い方
    • RiverpodやHooksによる状態管理
    • Firebaseとの連携

    おすすめポイント
    動画で実際の操作を見ながら学べるので、つまずきにくいのが最大の魅力です。各動画のタイトルが内容を明確に示しているため、後から見返すときも探しやすいです。

    参考リンク 動画一覧(テキストベース)


    ステップ2【体系的な知識習得】Flutter実践開発

    学べる内容

    • Dart言語の詳細な解説
    • サンプルアプリを通じた実践的な開発
    • 画面設計・画面遷移の実装
    • 状態管理とAPI通信
    • パフォーマンス最適化
    • iOS/Androidのネイティブ知識

    おすすめポイント
    Flutterの「辞書」として手元に置いておきたい一冊。何度も読み返すことで理解が深まります。

    注意点

    • Riverpodについてはそんなに触れる程度
    • 個人開発でよく使うFirebaseは扱っていない

    ステップ3【実践演習】ポケモンから学ぶFlutter

    Zenn記事 ポケモン図鑑アプリハンズオン

    学べる内容

    • 基本的なWidgetの実践的な使い方
    • APIを使ったデータ取得と表示

    おすすめポイント
    実際に動くアプリを作りながら学べるので、達成感があります。Riverpodを使わないシンプルな構成です。そのため基礎に集中できる点がおすすめです。


    ステップ4 Riverpod公式リファレンス

    公式ドキュメント Riverpod公式(日本語)

    こんな人向け

    • 仕事でFlutterを使う予定がある
    • 状態管理を学びたい
    • テストしやすいコードを書きたい

    Riverpodを学ぶべき理由

    • 状態管理パッケージとして業界標準
    • 依存性注入が簡単
    • テストコードが書きやすい
    • 保守性の高いコードが実現できる

    様々な記事を読みましたが、公式ドキュメントが最も分かりやすかったです。

    たとえば、サンプルアプリとして紹介されているのなかの1つのTODOリストのコードをよんでみるのもおすすめです

    以下は、自分がRiverpodを学習するときに初めに知っておきたかったことです

    コード生成で作られるプロバイダーは6種類だけ

    @riverpod アノテーションを使ったコード生成で自動的に作られるプロバイダーは、実は以下の6種類のみです

    関数ベース(戻り値で決定)

    • Provider (戻り値が T)
    • FutureProvider (戻り値が Future<T>)
    • StreamProvider (戻り値が Stream<T>)

    クラスベース(継承元で決定)

    • NotifierProvider (継承元が Notifier)
    • AsyncNotifierProvider (継承元が AsyncNotifier)
    • StreamNotifierProvider (継承元が StreamNotifier)

    これらに familyautoDispose のバリエーションが加わるだけなので、まずはこの6種類を押さえておけば大丈夫です


    おわりに

    基礎が固まったら、あとは作りたいアプリを実際に作っていきましょう!

    次のステップにおすすめ

    転職・仕事で使う予定の方へ
    API通信の処理は実務で必須スキルです。GitHubクライアントアプリを調べながら作ってみることをおすすめします

    この記事が、Flutter学習の助けになれば嬉しいです