ViewModel を捨てて マルチプラットフォーム に備える

AAC ViewModel

どの Compose バージョンでもシームレスに動作するマルチプラットフォーム ViewModel のようなものをお考えでしょうか?

AAC ViewModel は Android 用の雑なもので、悪いパターンを増殖させる理由はないと思います。データレイヤーが適切に設計されていれば、AAC ViewModel を使う必要がないことに気づくはずです。

しかし、おそらく一番良いのは、アプリが本物のデータ層(キャッシュ、ネットワーク層など)を持つことです。 ViewModel はデータレイヤーを参照するかもしれませんが、ViewModel 自身はすべてのインタラクションを直接処理するべきではなく、プラットフォームに依存しないデータレイヤーがそれを行うべきです。

@JimSproch
Senior software engineer at Google. Progenitor of Jetpack Compose (May 2017). Now working on giving Compose its next-generation super-power.

👉 Jim Sproch(@JimSproch)さん / Twitter hatena-bookmark

クラッジ kludge
その場しのぎに間に合わせで採る安易な方法。またそうした問題回避。特にコンピューターのプログラミングやシステム構築で,とりあえず動くが不調和な組み合わせを持ったその場しのぎのもの。

AAC ViewModel の件、全く同感です。AAC ViewModel を不要にするような形で Compose が考案されたことは喜ばしいことです。
しかし、Compose の成功のためには、マルチプラットフォームのアーキテクチャパターンをいくつか考え出すことが本当に重要だと思います。

印刷して額に入れよう。

あとは、独占しているコンフィグ不要のしくみを取り除いて、人々に返すだけです。
👉 android:configChanges - Android デベロッパー  |  Android Developers hatena-bookmark

「なぜ?」と思われる方のために、もう少し詳しく説明します。

AndroidのViewModelは不要、その理由は?
ViewModel は Android アプリケーションで最も人気のある構成要素の一つですが、私は自分のプロジェクトでは使っていません。Android 開発者の中には、特に「ViewModel 時代」にキャリアをスタートさせた人にとっては、これはクレイジーに聞こえるかもしれません。

最初の導入時、ViewModel は素晴らしかったのですが、今は Navigation Component があり、それを異なる場所に配置しなければならないので、少し混乱しています。しかし、赤ん坊を風呂の水と一緒に捨てるわけにはいかないと思います。

私達は、これらのライブラリはどちらも使用しません。

throw the baby out with the bath water

意味・対訳
大事なものを無用なものといっしょに捨てる

では、AAC ViewModel の優れた代替手段は何ですか?

必要ない、というのが元のツイートのポイントです。ドメインに特化したデータレイヤーが欲しいなら、画面に特化したプレゼンターとレンダーレイヤーを用意すれば良いです。Compose UI やクラシックビューでやればいい。AAC ViewModelは常に奇妙なボルトオンのソリューションでした。

いくつかのプロジェクトをKMMに移行したいのですが、AAC ViewModel を捨てれば、おそらく作業はよりシンプルになると思います。

👉 Android ViewModel が不要である理由 hatena-bookmark
👉 【MVVM】 Kotlin Flow で使える5つの利用パターン hatena-bookmark


Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException

build 失敗して出ますよね。

意味は、

設定しているリポジトリにそのモジュールのそのバージョンがないよ。

ということです。

今、こういうの出ました。


Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find app.cash.sqldelight:android-paging3-extensions:2.0.0-alpha03.
Searched in the following locations:
  - https://dl.google.com/dl/android/maven2/app/cash/sqldelight/android-paging3-extensions/2.0.0-alpha03/android-paging3-extensions-2.0.0-alpha03.pom
  - https://repo.maven.apache.org/maven2/app/cash/sqldelight/android-paging3-extensions/2.0.0-alpha03/android-paging3-extensions-2.0.0-alpha03.pom

エラーの https から始まるリンクから「バージョン」を含む文字列までを省いてブラウザでアクセスします。

👉 https://dl.google.com/dl/android/maven2/app/cash/sqldelight/android-paging3-extensions/hatena-bookmark

👉 https://repo.maven.apache.org/maven2/app/cash/sqldelight/android-paging3-extensions/hatena-bookmark

maven central にある、android-paging3-extensions の最新バージョンは、「2.0.0-alpha01」ですね!

build.glade のバージョンを変更すれば通りますね!

 

まとめ


Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException

が出たときは、build.gradle に設定したリポジトリに、そのバージョンが存在しません。エラーメッセージそのままですね!

ほぼ、利用してるリポジトリは以下2つのリポジトリであることが多いでしょう。


repositories {
  google()
  mavenCentral()
}

以下の2つをブラウザにブックマークしておくといいですね。

👉 Google's Maven Repository hatena-bookmark
👉 Maven Central Repository Search hatena-bookmark


「データ セーフティ セクション」のポリシー違反は「アプリ アップデート」が公開されたあとに時間を置いて解決する件

数週間やってました。

ずっと解決しないので困ってました「データ セーフティ」の公開部分の申請。

データセーフティセクション の申請を入力すると、

アプリのアップデートが公開されたあと、

大体24時間ぐらい経つと

データセーフティセクションの問題表示も消えました。

我慢できずにデータセーフティセクションを書き換えると

ずっとデータセーフティセクションの問題は解決されていないと表示されたまま


データセーフティセクションの申請内容の更新

↓

アプリアップデートの公開

↓

データセーフティセクションの申請内容の更新

↓

アプリアップデートの公開

↓

(以下ループ)

というような無限ループとなります。

データセーフティセクションの記入内容の審査は

アプリアップデートの公開の審査に含まれてる。

ということなのでしょう。

ハマります、悩みます。