基礎から学ぶFlutter
C&R研究所
著者:石井幸次
PROLOGUE
本書について
CHAPTER 01 スタートガイド
001 Flutterとは
002 Flutterの利点
高い生産性
美しく高度なカスタマイズ可能なUI
ネイティブパフォーマンス
003 開発環境構築
macOSでの環境構築
コードフォーマットとLinter
COLUMN 末尾のカンマ
004 プロジェクトの作成方法
コマンドでの作成方法
Android Studioでの作成方法
005 Flutterプロジェクト
プロジェクト構成
pubspec.yaml
main.dart
まとめ
COLUMN ホットリロードとホットリスタート
COLUMN Flutter For Web
006 画面遷移
画面間のデータの受け渡し
Named Routes
Navigator」クラスのその他のメソッド
まとめ
CHAPTER 02 Dart
007 Dartの歴史
008 Dartの文法
COLUMN DartPad
重要なコンセプト
変数
COLUMN Null Safety
Built-in型
関数
COLUMN 拡張関数
例外
クラス
コンストラクタ
Enum
typedef
ライブラリと可視性
009 Dartの特徴
JITとAOT
シングルスレッド
イベントループ
Future
Stream
async/await
ジェネレーター
Isolate
010 その他の重要な機能
Conditional member access operator
カスケード記法
Spreads記法
Collection if
Collection for
CHAPTER 03 ウィジェット
011 基本的なウィジェット
「Text」「RichText」ウィジェット
「DefaultTextStyle」ウィジェット
「Image」「RawImage」ウィジェット
「Icon」ウィジェット
「MediaQuery」ウィジェット
012 Single-child layout widgets
「Container」ウィジェット
「BoxDecoration」クラス
「SizedBox」ウィジェット
「Align」「Center」ウィジェット
「FractionallySizedBox」ウィジェット
「Padding」ウィジェット
「EdgeInsets」クラス
「ConstrainedBox」ウィジェット
「BoxConstraints」クラス
「FittedBox」ウィジェット
「AspectRatio」ウィジェット
「LimitedBox」ウィジェット
「Spacer」ウィジェット
「LayoutBuilder」ウィジェット
013 Multi-child layout widgets
「Column」「Row」ウィジェット
「Stack」ウィジェット
「Positioned」ウィジェット
「Expanded」ウィジェット
「Flexible」ウィジェット
「Wrap」ウィジェット
「Table」ウィジェット
「IndexedStack」ウィジェット
その他のウィジェット
014 Painting and effects
「DecoratedBox」ウィジェット
「Opacity」ウィジェット
「ClipOval」ウィジェット
「ClipRect」ウィジェット
「ClipRRect」ウィジェット
「CustomPaint」ウィジェット
「Transform」ウィジェット
「BackdropFilter」「ImageFilter」ウィジェット
015 Scrolling
スクロール系のプロパティ
「ListView」ウィジェット
「GridView」ウィジェット
「SingleChildScrollView」ウィジェット
「PageView」ウィジェット
「CustomScrollView」「NestedScrollView」ウィジェット
016 Input
「Form」「FormField」ウィジェット
「InputDecoration」クラス
017 Interaction model widgets
「GestureDetector」ウィジェット
「AbsorbPointer」ウィジェット
「ReorderableListView」ウィジェット
「Dismissible」ウィジェット
「Draggable」「DragTarget」ウィジェット
018 Async
「FutureBuilder」ウィジェット
「StreamBuilder」ウィジェット
019 その他
「Semantics」ウィジェット
「SafeArea」ウィジェット
「ValueListenableBuilder」ウィジェット
020 アニメーション系ウィジェット
アニメーションの種類
「AnimatedController」を利用しないウィジェット
「AnimatedController」クラスを利用するウィジェット
カスタムアニメーション
021 コントローラークラス
CHAPTER 04 Material ComponentsとiOS-Style
022 Material Components
「MaterialApp」ウィジェット
「Scaffold」ウィジェット
「Appbar」
「Drawer」
「Tab」「TabBar」「TabBarView」
Bottom Navigation
「SliverAppBar」「SliverList」「FlexibleSpaceBar」
「InkWell」ウィジェット
「RaisedButton」「FlatButton」「OutlineButton」
「IconButton」
「FloatingActionButton」
「DropdownButton」
「PopupMenuButton」
「ButtonBar」
「ToggleButtons」
「Checkbox」「Radio」「Switch」ウィジェット
「Chip」ウィジェット
「TextField」ウィジェット
「Slider」「RangeSlider」ウィジェット
「ListTile」ウィジェット
「Card」ウィジェット
「Stepper」ウィジェット
「Tooltip」ウィジェット
「ColorFiltered」ウィジェット
「LinearProgressIndicator」「CircularProgressIndicator」ウィジェット
「RefreshIndicator」ウィジェット
「DataTable」ウィジェット
「ExpansionPanelList」「ExpansionPanel」ウィジェット
Date & Time Pickers
「SimpleDialog」ウィジェット
「AlertDialog」ウィジェット
「BottomSheet」
「SnackBar」ウィジェット
023 Material Theming
基本
ボタン・アイコン
ダイアログ
フォーム
「SnackBar」ウィジェット
Dark mode
024 Cupertino(iOS-style widgets)
「CupertinoApp」ウィジェット
「CupertinoPageScaffold」ウィジェット
「CupertinoNavigationBar」ウィジェット
「CupertinoSliverNavigationBar」ウィジェット
「CupertinoTabScaffold」「CupertinoTabBar」「CupertinoTabView」ウィジェット
「CupertinoButton」ウィジェット
「CupertinoTextField」ウィジェット
「CupertinoSegmentedControl」ウィジェット
「CupertinoSwitch」ウィジェット
「CupertinoSlider」ウィジェット
「CupertinoActivityIndicator」ウィジェット
「CupertinoDatePicker」ウィジェット
「CupertinoTimePicker」ウィジェット
「CupertinoAlertDialog」ウィジェット
「CupertinoActionSheet」ウィジェット「CupertinoPicker」ウィジェット
CHAPTER 05 ライブラリ
025 パッケージの種類
Dartパッケージ
Pluginパッケージ
026 パッケージの組み込み方法
027 便利なパッケージ
「http」パッケージ
COLUMN quicktype
COLUMN openapi-generator
「graphql」パッケージ
「shared_preferences」パッケージ
「sqflite」パッケージ
「intl」「intl_translation」パッケージ
028 プラットフォームアクセスとPluginパッケージ
プラットフォームへのアクセス方法
Pluginパッケージの作り方
COLUMN Platform View
CHAPTER 06 Flutterの内部構造
029 ライフサイクル
StatelessWidget
StatefulWidget
RenderObjectWidget
WidgetsBindingObserver
030 Key
COLUMN 主なKeyの実装
031 BuildContext
COLUMN なぜ「showSnackBar」をするとエラーが起きる場合があるのか
CHAPTER 07 アーキテクチャ
032 サンプルアプリの概要
033 「setState()」メソッドだけを使ったサンプル
034 「InheritedWidget」ウィジェットとは
035 「InheritedWidget」ウィジェットを使ったサンプル
COLUMN v1.12.1からのDeprecated
036「InheritedModel」ウィジェットについて
037 「StreamBuilder」ウィジェットを使ったサンプル
038 BLoCパターンとは
入力と出力は単純な「Sinks」「Streams」のみ
依存関係は注入可能でプラットフォームに依存しない
プラットフォームによる分岐処理を書いては駄目
UI設計のガイドライン
039 BLoCパターン(非同期)のサンプル
040 BLoCパターン+「InheritedWidget」ウィジェットのサンプル
041 BLoCパターン +「provier」プラグインのサンプル
042 Scoped Modelパターンとは
043 「scoped_model」プラグインのサンプル
ScopedModel.of vs. ScopedModelDescendant
044 標準機能だけのScoped Modelのサンプル
ValueListenableBuilder・ValueNotifier
045 「provider」プラグインによるScoped Modelのサンプル
ChangeNotifierProvider
046 Reduxパターンとは
Reduxの3原則
Data Flow
Reduxでの構造と処理の流れ
データフロー図
047 Reduxパターンのサンプル
State
Action
Reducer
Store
Middleware
UIStoreConnector vs. StoreBuilder
CHAPTER 08 テスト
048 単体テスト
基本
mock_web_server
mockito
COLUMN 暗黙的インターフェイス
COLUMN 「mockito」パッケージのTips集
049 Widgetのテスト
COLUMN Finder
COLUMN 「Matcher」クラス
050 インテグレーションテスト
インストルメンテーション
テストスイート
テスト実行
パフォーマンスプロファイリング
CHAPTER 09 パフォーマンスチューニング
051 フレームレート
052 ウィジェットの再構築
053 パフォーマンス測定
ウィジェットの再構築数が問題の場合
UIスレッドで問題がある場合
054 パフォーマンスを意識した実装
ウィジェットの再構築を意識する
「saveLayer()」メソッドに気を付ける
アニメーションでの「Opacity」ウィジェットを避ける
「AnimatedBuilder」ウィジェットは「builder」関数を意識する
APPENDIX アセット
055 Asset
Assetの指定
Asset variants
テキストAssetの読み込み
プラットフォームからの読み込み
アプリのアイコンの設定
起動画面の設定
索 引