ltmemo

Flutter触ってみたのでメモ

tags: flutterdart
2023-02-06

ToC

何を学ぶか

友人がなにか新しい言語やりたいね〜という話をしていて、
どうせならということで複数人巻き込んでFlutterに入門することになったので、メモ置き場とする

作ったアプリはこのリポジトリ

Flutterの構成要素

  • Flutterは3層に別れている。公式document
    • Flamework
    • Engine
    • Embedder

Widget

  • widgetがUIの設定で、こいつの設定とstateでもってelementが描画されるイメージらしい
  • padding設定にはPaddingというそのまんまなwidgetがある
  • Columnでchildrenを縦並べ
    • Spacerで余白を調整する。flexっぽい?
  • 状態を持つStatefullWidgetと状態を持たないStatelessWidgetがある
    • Stateもclassとして定義し、Widget側のcreateState関数で作ったStateクラスのインスタンスを返す
    • State自体もbuild関数を定義することができる
  • AppBarはheader的なもののようだ
  • GridViewでGrid表示ができる
  • ListViewのような動的な要素をColumnのchildrenとして表示する場合、Expandedで囲わないとエラーが出る
    • sizeの計算がうまくいかない場合があるようだ

画面の遷移

  • Navigatorを使う。Navigator.push(),のような感じで呼び出せるようだ
    • webのようにURLではなく、遷移先のWidgetを投げ込む形

Dartメモ

  • A..B()のような構文がある。カスケード表記 と呼ぶらしい。(cascades notation)
    • これを使うと、Aに対する操作が複数ある時、Aを省略できる。メンバ変数への代入とかもできるので初見でびびった
  • @override
    • interfaceの関数をoverloadしているという宣言
  • const
    • finalより強い。コンパイル時に値がわかるものにしか使えない
  • required
    • 必須の引数
  • 名前付き引数がある
  • folder構成
    • 推奨なものはないっぽい。MVVMやRedux(こっちにもあるんだ)など、採用するアーキテクチャによっても変わりそう
  • testの叩き方
  • dataはどこに永続化するの
    • nativeだとどうなる?
  • path_provider
    • プラットフォームによってアプリのディレクトリが違ってくるから、そういう違いを吸収してくれる
      • osのpathデリミタが違うのを吸収してくれるみたいな話でおもろかった。確かに必要だよな〜
  • part
    • fileを分けるけど、拡張ファイル的な概念。Cのincludeっぽい
  • package_info_plus
    • licenseをまとめて表示してくれる便利package

Reactからの差分

  • 全体的に書きづらいReactのclassコンポーネントを書いてる気持ちになる
    • が、これは普段React+TypeScriptに慣れているからなので当たり前
  • Reactを参考にしているからか、Reduxがflutterにもあったり、setStateというまんまな関数があったりする
  • widgetの階層をまたいだときのデータのやり取りどうするの? みたいな課題感はwebフロントと一緒
  • riverpodはだいぶややこしい書き味に見えたが、最初にreduxを見た人も同じこと思ってそう
    • 変更をwatchする書き方がReactと違うだけと思ったらまぁそういうもんかと腹落ちした
    • Flutterでも単方向データフロー+immutableなデータを使う、という文化は推奨されている雰囲気
  • frontではSWRやTanStackQueryのように宣言的に寄せる文化があるが、ネイティブアプリが追従するかは気になる
    • 似たような仕組みはありそうだったが深く掘り下げていない
  • SSR、SSGのような文化は必要ないので、そこで差分が出てきそうだ

Riverpodなどを用いたデータ管理

  • FlutterでもSSOTの考え方がある。Reactのstateみたいなのがあるしな
  • RiverpodはReactのcontext(っぽい)仕組みで、providerを用意してそれを必要なcomponentがwatchする形になっている
    • このinterfaceを守ればwatchする側は裏側を知らなくて良い
    • firebaseでもなんでもこの仕組みで扱える
  • 見た目はちょっと慣れないと使いづらそうだったので要素振り

最終更新: 2023-03-20