FlutterKaigi 2024 day2

出前館は3つアプリがあってどれも Flutter
- ユーザ
- 配達員
- 加盟店

状態と機能を既存の UI にとらわれずに整理したい
個人情報の入力を省略して共有する方法はないだろうか

package を導入するとそれだけでコストになる
マクロを活用することで packages を導入しなくても実現できる選択肢が増える

- Type
- Declaration
- Definision

フェーズによってマクロの適用順序の結果が一意に定まるようにしている

MaterialApp は AnimatedTheme でテーマの切り替えのアニメーションのカスタマイズが可能

- Color
- Elevation
- Icons
- Motion
- Shape
- Typography

Theme.of(context)
で親からもらった Context でテーマ継承してオーバーライドしたりできる

Action Chip は M2 までで M3 では削除されている

M2 と M3 の差分がまとまっている

Obfuscate 難読化の英語表現

- リバースエンジニアリングへの防御
- バイナリサイズの軽量

Flutter release build で難読化される

Obfuscation map に難読化の結果をマッピングしていく

--split-debug-info
で Dart プログラムのダンプの出力先を指定できる

難読化のコマンド。ダンプ出力とセットで行う
flutter build apk --obfuscate --split-debug-info

難読化するときに symbols file が出力されるので、この file を元に symbolize で難読化を解除できる

symbols file は Production のスタックトレースの解析にも必要

Sentry
CI のためのプラグインが symbols のアップロードをサポート

Dart includes both a Dart VM with just-in-time (JIT) compilation and an ahead-of-time (AOT) compiler for producing machine code.

対応時の Issue だろうか

Unlike Java, Dart doesn't have the keywords public, protected, and private. If an identifier starts with an underscore (_), it's private to its library. For details, see Libraries and imports.

各プラットフォーム向けのコマンドは Dart で記述されている

Android 向けの難読化?
Groovy で書かれている

- Dart 向けの難読化
- Android 向けの難読化
2フェーズ実施する
他のプラットフォーム向けも同様

Web は Minification
Obfuscation しない

- R8 の keep rule 相当の難読化しない方法もある
- debug symbols をバイナリに含めないオプションで軽量化できる
- runtime で型を比較しているランタイムエラーが発生しうる

FFI Foreign Function Interface

ネイティブから Flutter にリプレイス
Add to App を利用して新しい機能から Flutter に置き換えていく
ネイティブコードはサービス開始 2012年からの積み重ねもあって OS 間の差異、技術的な負債が蓄積している状態

例外処理の対応方針が決まっていない
リプレイスするときに仕様策定が必要な状態

- Separation of Concerns
- Flutter/Dart
- Client/Server
- Design Pattern
- Testing Business Logic

repository を境界にしてサーバサイドの影響の吸収する層として重要な位置

base_ui は Figma に依存する
Figma から生成できると理想

system で 3rd party への依存を取りまとめる?
依存を吸収する層を作った方が良いのか?

riverpod Dart に閉じたものとそうでないものがある
- riverpod
- flutter_riverpod
- hooks_riverpod

アノテーションでサーバの実態をリプレイス用の適切なドメインに変換できる

bool を期待しているのに、 "0" : "1" とか返ってくるケースにも変換できる

ログイン頻度のロジックがクライアントに持つのが少し気になる
サーバ側で頻度のコードを送って欲しい気もする

業務知識の例外を用意して throw して UI で適切なユーザフィードバックを表現できるようにする

public member はドキュメントを書くことを強制する LInt ルール

PR で Unit Test Coverage が 100% がマージ条件の一つとして防御している

スニペット化を定義
スニペットが使えない場合はアラートを上げてペアプロする

Cursor に指示を出してコード生成する
このときにもスニペットを入力すると期待したコードが生成されやすい

- Widgets:
- Elements: 構成要素
- RenderObject: 画面描画を管理

Constraints go down. Sizes go up. Parent sets position.

制約は親から子へ伝わり
大きさは子から親へ伝え
親が位置を決める

Flutter ドキュメントにもスニペットが用意されている

SwiftUI の Geometry とコンテキストは同じだろうか

SliverAppBar が変化する実装の実体

新しく追加された Widgets