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