先週、「Jetpack Compose, React, Flutter, SwiftUIを比較する」という記事で宣言的UIの各ツールの比較を行いました。
その中で、Jetpack Compose特有の特徴としてコンポーネントに返り値がないことを紹介しました。
これは、React等で遵守されてきたコンポーネントは純粋関数として扱うというルールから逸脱したものとなります。
その理由について、Jetpack Composeの開発に携わるJim SprochさんからTwitterでリプライを頂きました。
今回はその内容について1つずつ深堀りしていきます。
宣言的UIの考え方はReact、Flutter、SwiftUI、Jetpack Composeと広がり、ほぼ全てのプラットフォームで利用できるようになりました。
今までのHTMLやXMLに対して命令的に処理を書くのに対し、宣言的UIはUIの構築や更新を圧倒的に簡素にしてくれます。
また、差分更新の仕組みを備えているものも多く、パフォーマンスの向上も見込めます。
今回はいくつかある宣言的UIのツール群の中から、代表的なJetpack Compose、React、Flutter、SwiftUIを個人的な見解も含めて比較していきます。
Androidアプリ開発を行う際、公式も推奨しているViewModelを使ったアーキテクチャを採用することが多いと思います。
ViewからViewModelに処理を移動させていくと、Viewに全てを書くよりは幾分かマシになります。
一方、アプリケーションが複雑になっていくと、今度はViewModelが肥大化するという問題に直面するでしょう。
この問題は様々な要因が考えられ、解決は容易ではありません。
私自身、いつも頭を悩ましながら、コードの整理に努めています。
今回は、私が最近試みた中で比較的うまく行っている方法の中から、Modelに処理を寄せる話と、UseCaseレイヤーの話を、コードの例を交えながら紹介します。
この記事はPRです。
@mhidakaさんからお声がけ頂き、先日発売された横幕 圭真さんと釘宮 愼之介さんの本「チームで育てるAndroidアプリ設計」をレビューすることになりました。
私なりに読んで感じたこと、そして自分のアーキテクチャの育成に対する考えを書きたいと思います。
このブログでは度々お伝えしていますが、Kotlin Coroutinesは非同期処理を強力に支援してくれます。
特に、値を複数回送受信することができるFlowの強化により、Kotlin Coroutinesの表現力がより一層向上し、一部LiveDataやRxJavaから移行する動きもあります。
一方で、AndroidのLifecycleを考慮し、非同期処理を安全に利用するためには、いくつか注意する必要があります。
今回は、以前からあるlaunchWhenStartedやlaunchWhenResumed等のlaunchWhenXX系と、lifecycle-runtime-ktx:2.4.0-alpha01で追加されたrepeatOnLifecycleの違いと使い分けについて紹介します。
Kotlin Coroutinesの進化はすざましく、とどまるところを知りません。
状態やイベントを扱いやすくなったStateFlowやSharedFlowが登場し、さらには、Lifecycleをより扱いやすくなったLifecycleOwner.addRepeatingJobやLifecycleOwner.repeatOnLifecycle、Flow.flowWithLifecycleが追加されました。
RoomやDataStore等Jetpackの各種ライブラリでもCoroutinesが使われており、Jetpack Composeでも様々なところでCoroutinesが活用されています。
そういった中で、一部LiveDataやRxJavaからCoroutinesに書き直す動きが見られ、多少混乱を招いていると感じています。
結論から言うと、現時点において積極的にCoroutinesに移行する必要性はないと考えています。
今回は、それらを比較しつつ、どういった使い分けをするのが好ましいのか私の視点からまとめます。
Jetpack Composeのβ版が公開され盛り上がりを見せていますが、まだまだAndroidでViewを作成する際はDataBindingが主流でしょう。
DataBindingはxml内でコードを参照することでアプリのデータとUIを同期することができ、MVVMのアーキテクチャでより威力を発揮します。
BindingAdapterを使うことで、独自のプロパティを作成することも可能です。
これらは非常に便利なツールですが、アニメーションを扱う上ことは若干苦手とします。
今回はアニメーション付きのBindingAdapterを作るときの注意点と、その解決方法について紹介をします。
Zennというサイトで、「詳解 Kotlin Coroutines [2021]」という本を公開しました。
これまでブログに載せてきた情報に加えて、Kotlin Coroutinesを体系的に学べるようまとめてあります。
1, 2章は無料公開しているので、ぜひご覧ください。
2021年2月28日まではセールで少しお安くお買い求め頂けます。
2020年ももうすぐ終わりですね。
今年は本当に激動の1年でした。
Androidアプリ開発においても、1年経てば色々と環境が変わってきます。
今年出た技術や注目された技術について、私なりの視点で解説していきたいと思います。
この記事は Kotlin Advent Calendar 2020の15日目の記事です。
非同期処理を書く際に、kotlin coroutinesは使いやすく、非常に強力です。
一方で、単体テスト等を書くのには一定のハードルがあります。
今回は、suspend functionをテストしたり、モックする方法について紹介します。
この記事はCyberAgent Developers Advent Calendar 2020の6日目の記事です。
ある程度の歴史の長いプロジェクトでは、リアーキテクチャやアーキテクチャのブラッシュアップ等により、複数のアーキテクチャが混ざるということが多々あると思います。
私もAndroidアプリにおいてMVCからMVVM、javaからkotlinへの段階的リアーキテクチャを進めています。
その中で一番重要なのは、 新アーキテクチャの実装/設計を旧アーキテクチャに依存させないことだと感じています。
今回は、それを実現するためのいくつかの工夫について紹介したいと思います。
この記事はAndroid Advent Calendar 2020の2日目の記事です。
SharedFlowやStateFlowの登場により、ますますkotlin coroutinesを手軽に扱えるようになってきました。
AndroidのMVVMにおいても、LiveDataの代わりにStateFlowを使ってViewとViewModelをbindingすることが可能になりました。一方で、ViewModelからViewに状態ではなくイベントを送るのは未だいくつかの問題があります。
今回は、複数の方法をメリットデメリットとともに紹介したいと思います。
StateFlowはkotlin corouteinsの1.3.6で追加された状態管理用の特別なFlowです。
以前、「StateFlowのドキュメントを読み込む」という記事を書きましたが、その後SharedFlowが追加され、若干実装に変更がありました。
また、新たにstateInというoperatorも追加されています。
今回はそれらを含めたStateFlowの詳細な仕様に関して深堀りしていきたいと思います。
突然ですが、2020年11月6日に入籍しました。
結婚記念日やその他記念日を忘れると、怒られが発生するので、記念日当日にslackに通知してもらいましょう。
今回はGAS(Google Apps Script)を使っていきます。
SharedFlowはkotlin corouteinsの1.4.0-M1で追加された新しいFlowです。
以前、Flow, SharedFlow, StateFlowの比較を行いました。
今回はSharedFlowの詳細な仕様に関して深堀りしていきたいと思います。