所感箱

所感を書きためていきます

Flutter開発とAndroid開発

Flutter界隈まだまだいい意味で枯れていないことが多く、コミュニティ全体でより良いアーキテクチャや開発手法が試行錯誤がされている状況だ。毎回、調べては忘れてしまうので、今回は、現状のFlutter開発のアーキテクチャやライブラリについて、Androidと比較しながらまとめておく。

アーキテクチャ

AndroidではMVVMが主流で、GoogleJetpackを提供して、開発者がスムーズにアプリ開発を進める環境を整備している。後述するJetpack Composeが登場したことで、変わる部分もありそうだが、基本的な方向性は変わらないと想定している。

developer.android.com

対してFlutterでは、まだまだベストプラクティスを作るために、試行錯誤を繰り返しており、デファクトスタンダードが決まりきっていない印象を持っている。 MVVMの形に落ち着くと、Android畑に主軸を置く身としては楽だなーと感じているが、 Android開発と比較して、MVVMの実現のために複数のサードパーティのパッケージを組み合わせて実現する必要がまだまだあるので、どれを選択するかは悩ましい部分がありそうだ。

wasabeef.medium.com

DI

Android開発では、DaggerやKoinを採用しているところが多い印象を持っている。最近は公式のガイドラインにDagger Hiltを用いたDIの解説も提供されていて、よりDaggerを採用する傾向が強まる印象を持っている。

developer.android.com

対して、FlutterではDIのみを提供するライブラリは、あまり使われていないようで、ProviderパッケージやRiverpodパッケージの機能を利用して、実現していることが多い状況に思う。

pub.dev

riverpod.dev

個人的には、DIライブラリは別の機能と混在しないほうが、責務が明確になりパッケージの改善も進むと思うので、injectorを採用するのもありなのかなーと思っている。

pub.dev

ネットワーク通信

Android開発では、retrofit + okhttpを主流で、公式のガイドでは、retrofitをネットワーク通信の方法がが紹介されている。

developer.android.com

ただ最近は、ktorを採用するところも増えてきている印象があり、新規開発であれば採用するのも選択肢としてはありな印象だ。

ktor.io

対してFlutter開発では、dartのhttpパッケージもしくは、chopperパッケージを使用している多いようで、そのどちらかを採用すると良さそうだ。

pub.dev pub.dev

View

Android開発はxmlでのレイアウトベースの開発が主流であったが、jetpack composeの登場で大きな変化が訪れている。例えば初めてFlutterを触ってリストビューの実装の楽さに驚いたが、jetpack composeでは、Flutterのリストビューウィジェットと同じような実装が可能になった。 例えば以下のコードでは、LiveDataの値が更新されると、必要な分だけリストビューが更新されるといった具合だ。

@OptIn(ExperimentalCoilApi::class)
@Composable
fun Contents(names: LiveData<List<ListViewItem>>, onClickContentButton: () -> Unit) {
    val namesState = names.observeAsState(emptyList()) // ここで値が購読され、namesの内容が変わるとリストビューにも反映される

    LazyColumn {
        items(namesState.value) { item ->
            when(item) {
                is ListViewItem.Header -> { HeaderView(item).buildView() }
                is ListViewItem.Content -> { ContentView(item, onClickContentButton).buildView() }
            }
        }
    }
}

developer.android.com

とはいえFlutterは、UIウィジェットの種類が豊富でドキュメントの充実度がすごいので、サクッとアプリを作る上では、まだまだFlutterの方が進めやすそうだなという印象。

flutter.dev

もちろんクロスプラットフォームのメリットが一番大きいので、iOSも一緒に作りたい場合は依然としてFlutterのするのが良いように思う。

まとめ

Flutter開発は、試行錯誤が大変な分、色々な選択の余地があって楽しいです!