目次
第1章 環境構築とアプリの実行 ── Flutter SDK,Android Studio,Xcode
1.1 なぜFlutterが注目を集めているのか
- マルチプラットフォーム
 - 高速な実行速度
 - 優れた開発者体験
 
1.2 Flutterの環境構築
- Flutterのインストール
 - プラットフォームごとの環境のインストール
- Androidの開発環境をインストールする
 - iOSの開発環境をインストールする
 - Tips:Xcodeのバージョンを使い分けるインストールのしかた
 - Tips:CocoaPodsがインストールできない場合
 
 - Android Studioの設定 ── Flutterと親和性の高いIDE
 
1.3 fvmによるFlutterのバージョン管理
- fvmのインストール
 - fvmを利用したFlutterのインストール
 
1.4 プロジェクトの作成
- Android Studioでの作成手順
 - テンプレートプロジェクトをのぞいてみよう
 - fvmの設定
 
1.5 Flutterアプリの実行
- iOS Simulatorでの実行
 - Android Emulatorでの実行
- Android Emulatorを作成する
 - Android Emulatorを起動し,アプリを実行する
 
 
1.6 まとめ
第2章 Dartの言語仕様
2.1 変数宣言
- 変数と型推論
 - 定数 ── finalとconst
 - いろいろな初期値の与え方
- 遅延初期化
 
 
2.2 組み込み型
- 数値型
- int ── 整数型
 - double ── 浮動小数型
 
 - String ── 文字列型
 - bool ── 論理型
 - List ── 配列
 - Set ── 集合
 - Map ── 連想配列
 - Record ── タプル
 - Objectクラス ── すべてのクラスのスーパークラス
 
2.3 ジェネリクス
- ジェネリッククラス
 - ジェネリック関数
 
2.4 演算子
- 算術演算子
 - 比較演算子
 - 三項演算子
 - カスケード記法
 - コレクションのオペレータ
- Spread演算子
 - 制御構文演算子
 
 
2.5 制御構文
- 分岐
- if文
 - if-case文
 - switch文
 - 式としてのswitch
 
 - ループ
- for文
 - while文
 - breakとcontinue
 
 
2.6 パターン
- マッチング機能しか持たないパターン
- 論理演算子,比較演算子
 - 一致判定
 
 - マッチングと分解宣言の2つの機能を持つパターン
- List
 - Map
 - Record
 - Object
 - Tips:for-in文での分解宣言
 
 - パターンを補助する構文
- キャスト
 - nullチェック
 - nullアサーション
 - ワイルドカード
 
 
2.7 例外処理
- 例外の型 ── ErrorとException
 - 例外の捕捉
 - 例外の再スロー
 - finally句
 - アサーション
 - Flutterの例外処理
 
2.8 コメント
2.9 null安全
- null許容演算子
 - null認識演算子
 - nullアサーション演算子
 - タイププロモーション
 - そのほかの便利なnull関連演算子
 
2.10 ライブラリと可視性
2.11 関数
- 引数
- 省略可能引数
 - 名前付き引数
 
 - 関数の省略記法
 - 第一級関数と匿名関数
 
2.12 クラス
- ゲッタとセッタ
 - いろいろなコンストラクタ
- constantコンストラクタ
 - 名前付きコンストラクタ
 - factoryコンストラクタ
 
 - クラス継承
- スーパークラスのコンストラクタ
 
 - 暗黙のインタフェース
 - 拡張メソッド
 - mixin ── クラスに機能を追加する
 - Enum
- Enumの宣言
 - Enumの利用
 
 - クラス修飾子
- abstract
 - base
 - interface
 - abstractとinterfaceの組み合わせ
 - final
 - mixin
 - sealed
 
 
2.13 非同期処理
- Future型
- エラーハンドリング
 
 - Stream型
- Streamの購読をキャンセル,一時停止する
 - Stream型を生成する関数
 - Streamの終わり
 - エラーハンドリング
 - StreamController
 - ブロードキャスト
 - Streamを変更する
 
 - Zone ── 非同期処理のグループ化
 - アイソレート
- Flutterアプリとアイソレート
 
 
2.14 まとめ
第3章 フレームワークの中心となるWidgetの実装体験 ── StatelessWidget,StatefulWidget
3.1 DartPadでアプリ開発を体験しよう
3.2 状態を持たないWidget ── StatelessWidget
- 独自のStatelessWidgetを定義する
 
3.3 状態を持つWidget ── StatefulWidget
- Widgetのタップ操作を検知する
 - StatefulWidgetを継承する
 - Widgetの状態を変化させる
 
3.4 まとめ
第4章 アプリの日本語化対応,アセット管理,環境変数
4.1 パッケージやツールを導入する
- パッケージの導入方法
 - パッケージバージョンの指定方法
 - パッケージバージョンの更新方法
- Tips:セマンティックバージョニングについて
 
 
4.2 アプリを日本語に対応させる
- 意図せず英語表示されるケース
- フレームワークが提供する表示文字列
 - 日付フォーマット
 
 - アプリを日本にローカライズする
- フレームワークが提供する表示文字列を日本語化する
 - 日付フォーマットを日本語化する
 - iOSアプリの対応言語を設定する
 
 - メッセージをローカライズする
- コードジェネレータを設定する
 - arbファイルを作成する
 - ローカライズされたメッセージを表示する
 
 - arbファイルの扱い方
- プレースホルダ
 - 単数形と複数形の対応
 - 複数の言語への対応
 
 
4.3 プロジェクトにアセットを追加する
- アプリに画像を追加する
 - 端末の解像度に応じて画像を切り替える
 - flutter_gen ── 型安全にアセットを扱うパッケージ
- flutter_genを導入する
 - SVG画像の利用
 - その他のアセット
 
 
4.4 dart-define-from-file ── 環境変数を扱う
- 環境変数をJSON形式で記述する
 - 環境変数をコードから参照する
 
4.5 まとめ
第5章 テーマとルーティング
5.1 テーマ ── アプリ全体のヴィジュアルを管理
- フレームワークによるテーマの自動計算機能
- ダークモード対応
 
 - アプリ独自のテーマ管理
- Theme Extensionを利用したアプリのサンプル
 - Tips:Cupertino(クパチーノ)デザイン
 
 
5.2 ナビゲーションとルーティング ── 画面遷移を実現する3つの手法
- NavigatorウィジェットとRouteクラスによる画面遷移 ── Navigator 1.0
- 画面間でのデータの受け渡し
 
 - 名前付きルートによる画面遷移 ── Navigator 1.0(非推奨)
- 名前付きルートの制限事項
 
 - Routerウィジェットによる画面遷移 ── Navigator 2.0
- go_routerによる画面スタックの書き換えを体験する
 - GoRouteで入れ子構造を作る
 - goとpushの違い
 
 
5.3 まとめ
第6章 実践ハンズオン(1) ── 画像編集アプリを開発
6.1 開発するアプリの概要
- スタート画面
 - 画像選択画面
 - 画像編集画面
 - 開発の土台づくり
 - テーマと画面遷移の方針
 
6.2 プロジェクトを作成する
- 開発の土台づくり
 
6.3 アプリ起動後のスタート画面を作成する
- レイアウトを作成する
 
6.4 テーマをアレンジする
6.5 アプリを日本語化する
- パッケージを導入する
 - ローカライズの構成ファイルを作成する
 - arbファイルを作成する
 - ローカライズされたメッセージを適用する
 - App Storeでの表示言語を設定する
 
6.6 画像選択画面を作成する
- メッセージを追加する
 - レイアウトを作成する
 - 画像ライブラリから画像を取得する
- パッケージを導入する
 - iOSネイティブの設定を行う
 - 画像を取得する処理を実装する
 - 画像取得処理をWidgetに組み込む
 
 
6.7 画像編集画面を作成する
- メッセージを追加する
 - レイアウトを作成する
 - 画像編集画面への遷移を実装する
 - アイコンを追加する ── flutter_genによるアセット管理
 - 画像を編集する処理を実装する
 
6.8 まとめ
- Tips:WidgetとStateのライフサイクルについて
 
第7章 状態管理とRiverpod
7.1 Flutterアプリにおける状態管理
7.2 Riverpodとはどのようなパッケージか
- Tips:宣言的UIとしてのFlutter
 
- Riverpodの主要なクラス
 - 実装サンプル
 
7.3 Riverpodの関連パッケージ
- 基本機能を提供するパッケージ
 - Providerのコードを生成するパッケージ
 - 静的解析を行うパッケージ
 - 関連パッケージまとめ
 
7.4 Riverpodの使い方
- Providerの種類
- 関数ベースのProvider
 - クラスベースのProvider
 
 - 非同期処理を行うProvider
- 非同期なProviderとRaw型
 
 - Providerから値を取得する
- Providerの値をフィルタする
 
 - Providerのライフサイクル
 - Providerにパラメータを渡す
 
7.5 まとめ
第8章 実践ハンズオン(2) ── ひらがな変換アプリを開発
8.1 開発するアプリの概要
- 入力状態
 - レスポンス待ち状態
 - 変換完了状態
 - 開発の土台づくり
 - テーマと画面遷移の方針
 
8.2 プロジェクトを作成する
8.3 アプリで使用するパッケージを導入する
- riverpod_lintを設定する
 
8.4 入力状態のウィジェットを実装する
- レイアウトを作成する
 - レイアウトを表示する
 - 入力値のバリデーションを行う
 
8.5 入力文字を取得する
8.6 ひらがな化するWeb APIを呼び出す実装をする
- リクエスト,レスポンスオブジェクトを定義する
 - アプリケーションIDを設定する
 - Web APIを呼び出す
 
8.7 アプリの状態を管理する
- 状態を表現するクラスを作成する
 
8.8 状態に応じて表示を切り替える
- レスポンス待ち状態のウィジェットを実装する
 - 変換完了状態のウィジェットを実装する
 - 画面の切り替えを行う
 - ひらがな変換処理の呼び出しを修正する
 
8.9 まとめ
第9章 フレームワークによるパフォーマンスの最適化 ── BuildContext,Key
9.1 BuildContextは何者なのか ── Element
- 祖先の情報にアクセスできるBuildContext
- Elementがツリーを構成していく工程
 
 - StatefulWidgetの状態を保持する役割
- Tips:宣言的UIとElementの再利用
 
 
9.2 Elementの再利用とパフォーマンス ── RenderObject
- RenderObjectは高コストな計算を行う
 - RenderObjectは状態を持つ
 - Elementの再利用はパフォーマンスに影響する
 
9.3 Keyは何に使うのか
- Elementが再利用される条件
 - Elementが再利用される様子を見てみよう
- Keyを利用したElementの再利用
 
 - Keyの種類
 
9.4 局所的にWidgetを更新するしくみ ── InheritedWidget
9.5 まとめ
第10章 高速で保守性の高いアプリを開発するためのコツ
10.1 パフォーマンスと保守性,どちらを優先すべきか
- 高速でないアプリとは
 - 高速だが保守性が低い実装
 
10.2 高速で保守性の高い実装
- buildメソッドで高コストな計算をしない
 - buildメソッドで大きなウィジェットツリーを構築しない
- ウィジェットツリーの階層が浅くなるようウィジェットの選択を見なおす
 
 - const修飾子を付与する
- const修飾子が使えるようウィジェットの選択を見なおす
 - 独自のウィジェットクラスにconstantコンストラクタを実装する
 
 - 状態を末端のウィジェットに移す
 - Riverpodの状態監視は末端のウィジェットで行う
- Tips:アプリのパフォーマンスを計測する
 
 
10.3 まとめ
第11章 Flutterアプリ開発に必要なネイティブの知識
11.1 ネイティブAPIのバージョンと最低サポートOSのバージョン
- 最低サポートOSのバージョン
- iOSの最低サポートOSバージョンを設定する
 - Tips:XcodeのBuild Settings
 - Androidの最低サポートOSバージョンを設定する
 
 - ビルドSDKバージョン
- iOSのビルドSDKバージョンの設定
 - AndroidのビルドSDKバージョンの設定
 
 - ターゲットSDKバージョン
 
11.2 アプリの設定変更
- アプリ名
- iOSのアプリ名を変更する
 - Androidのアプリ名を変更する
 
 - アプリアイコン
- iOSのアプリアイコンを変更する
 - Androidのアプリアイコンを変更する
 - アプリアイコンを手軽に生成するパッケージ
 
 - スプラッシュ画面
- iOSとAndroidで異なるスプラッシュ画面の位置付け
 - iOSのスプラッシュ画面
 - Androidのスプラッシュ画面
 - スプラッシュ画面を手軽に実現するパッケージ
 
 - アプリのID
- iOSのアプリIDを設定する
 - AndroidのアプリIDを設定する
 
 
11.3 アプリの配布とコード署名
- iOSのコード署名
- 管理の難しい秘密鍵
 - アプリに署名する
 
 - Androidのコード署名
 - apkファイルとaabファイル
- アプリに署名する
 - aabファイルをアップロードする