【Kotlin】Compose Multiplatform 1 (81レス)
上下前次1-新
1: デフォルトの名無しさん [] 2024/06/20(木)23:47 ID:vbElSNSS(1/2)
iOS、Android、デスクトップ、Webに対応したUIフレームワークで手軽にアプリを作りましょう!
・各種プラットフォーム間でコードを共有可能
・宣言型UIによる最大100%のコードベース
・Kotlin Multiplatform (KMP) & Jetpack Composeベース
2: デフォルトの名無しさん [] 2024/06/20(木)23:47 ID:vbElSNSS(2/2)
公式
https://www.jetbrains.com/ja-jp/lp/compose-multiplatform/
3: デフォルトの名無しさん [] 2024/06/20(木)23:57 ID:wkeLzLVS(1)
KMP対応Composeライブラリ一覧
https://github.com/terrakok/kmp-awesome
4: デフォルトの名無しさん [sage] 2024/06/21(金)04:25 ID:jKJT7aI8(1)
これってなんなの?GUI部分しか作れないの?
5: デフォルトの名無しさん [] 2024/06/21(金)06:37 ID:XqVI1f39(1)
ビジネスロジック、GUIともにKotlinでコードを書けるよ
6: デフォルトの名無しさん [sage] 2024/06/21(金)07:04 ID:Atsq9vif(1)
Kotlinは書いてて楽しいからすき
7: デフォルトの名無しさん [sage] 2024/06/21(金)07:21 ID:Rhs7e8T4(1)
Jetpack Composeやってるけど特に状態まわりでFlutterより書きやすい
8: デフォルトの名無しさん [sage] 2024/06/21(金)07:34 ID:6EoJ4PVu(1)
お、ついにComposeのスレが立ったか!
みんなKotlinのComposeやろうぜ!!
9: デフォルトの名無しさん [sage] 2024/06/21(金)07:53 ID:59+ROyU+(1)
うおおおやるか
10: デフォルトの名無しさん [sage] 2024/06/24(月)02:08 ID:LPHYNtWT(1)
Kotlin Fest 2024のメモまとめ
https://qiita.com/FalconFlat/items/7f802d95d6e1a686fb96
11: デフォルトの名無しさん [sage] 2024/06/29(土)11:04 ID:CFjt49h3(1)
久しぶりに調べたけど
DataStore,RoomやLifeCycleやViewModelもKMPいけるのか?
NavigationもJetbrainsから出るの?
そろそろ感じやな
12: デフォルトの名無しさん [sage] 2024/06/29(土)21:55 ID:ootEijyj(1)
SQLiteに関してはSQLDelightはちょっと使いにくいと感じてたからRoomのKMP対応は素直に嬉しい
あと最新SQLite3.46.0バイナリを同梱したドライバを泥のRoomで使えるようになったからON CONFLICTとかを書けるようになって便利
13: デフォルトの名無しさん [sage] 2024/06/30(日)11:47 ID:V38GczC3(1/8)
クライアントアプリのORMはRoomみたく
FlowみたくDBをwatchする機能ないとつらいよな
たいていリアクティブにつくってるからな
つか、最新のしたら大量アイテムのリストのスクロール
かなり速くなってるけど
デバッグ時はクソ重くてつらい
プロファイルリリースだと速いが
14: デフォルトの名無しさん [sage] 2024/06/30(日)12:16 ID:V38GczC3(2/8)
ナビゲーションをまじめにやろうとしてるけど
どすればいいんだ?
Androidの場合、Activityと便利なサブコンポーネントFragment
でそろぞれ、バックスタックがあって作りやすいけど
Flutterの場合もナビゲーションをネストすれば画面とそのFragmentに
あたるWidgetそれぞれでバックスタックあってナビゲーヨンできるけど
15: デフォルトの名無しさん [sage] 2024/06/30(日)12:38 ID:V38GczC3(3/8)
Androidの場合、ViewModelをActivityやFragmentにそれぞれ結びつけることで
UIの状態の管理が楽だったけど同じようにやりたい
まずActivityに相当するコンポーザブルにそれぞれViewModel結び付けて
さらにFragmentに相当するコンポーザブルにもそれぞれViewModel結び付けて
管理したい
でも例えば
https://zenn.dev/joo_hashi/books/f646fb076f58dc/viewer/42fdf7
だと、1Activity内で画面切り替えてるだけだからViewModelのスコープが望ましくない
16: デフォルトの名無しさん [sage] 2024/06/30(日)13:17 ID:0SycvWcc(1/3)
androidx.lifecycle.viewmodel.composeのviewModel()を使えばコンポーザブルの中でViewModelを宣言できるようになる
17(1): デフォルトの名無しさん [] 2024/06/30(日)13:32 ID:0SycvWcc(2/3)
コンポーザブルの中で画面ごとにViewModelを宣言しちゃうなんてライフライクル管理は大丈夫なの?っていう疑問はあると思うけど、ちゃんと
androidx.navigation:navigation-compose
がきっちり解決してくれてる
蛇足だけど内部実装ロジックについては
「navigation-compose は ViewModel のライフサイクルをどう管理しているのか」
https://y-anz-m.blogspot.com/2021/08/navigation-compose-viewmodel.html
の解説記事が参考になる
18(1): デフォルトの名無しさん [sage] 2024/06/30(日)13:33 ID:V38GczC3(4/8)
つか、そもそもなぜAAC ViewModelを使いたいのかというと画面回転などの構成変更
でもUIの状態を保持できるからなんだけどそれは基本従来のViewベースのときに
Activityを再作成するからだよね
Jetpack Composeベースの時は基本、画面回転でもActivity再作成しないから
別にViewModel使う必要ねぇのか..
壮大な勘違いをしていたかも
19: デフォルトの名無しさん [sage] 2024/06/30(日)13:35 ID:V38GczC3(5/8)
>>17
解説記事読んでみます
20(1): デフォルトの名無しさん [sage] 2024/06/30(日)13:36 ID:0SycvWcc(3/3)
>>18
画面回転したら再生成されちゃう
rememberSaveable使えばいけるけど面倒くさいから結局ViewModel使うかってなる
21: デフォルトの名無しさん [sage] 2024/06/30(日)13:44 ID:V38GczC3(6/8)
>LocalViewModelStoreOwner には MainActivity ではなく NavBackStackEntry が入っていることがわかりました。
あぁ、なるほど
navigation-compose使うとViewModelがMainActivityではなくNavBackStackEntryに紐づくのではないのですね
大変参考になりました
22: デフォルトの名無しさん [sage] 2024/06/30(日)13:49 ID:V38GczC3(7/8)
>>20
ごめんなさい。間違ってました。
今、新規の空のCompose Empty Activity作ってマニュフェストのActivityの設定みたら
android:configChangesに何も設定されていませんでしたね
てっきり、ここにorientationとか設定されているのかと思いました
23: デフォルトの名無しさん [sage] 2024/06/30(日)14:27 ID:V38GczC3(8/8)
>NavBackStackEntryに紐づくのではないのですね
NavBackStackEntryに紐づくのですね
24(1): デフォルトの名無しさん [sage] 2024/07/05(金)10:54 ID:OeiRQJMt(1/2)
Room絡みのKMP対応が進んでるけど
それにあわせてSqlDriver?
これでBundledDriverみたいなのあるけど
これってKMPじゃなくて普通のAndroidプロジェクトでも使えるのかな?
普通のAndroidプロジェクトでも最新のSqlite使いたい
25(1): デフォルトの名無しさん [sage] 2024/07/05(金)14:41 ID:4QgwhxP+(1)
>>24
使えるで
https://qiita.com/yuya2011/items/c3baea9a2fc4a6fce970
この記事はRoomでBundledSQLiteDriverしてUPSERT使っててGitHubに泥アプリのサンプルあげてるみたい
26: デフォルトの名無しさん [sage] 2024/07/05(金)20:29 ID:OeiRQJMt(2/2)
>>25
おお、ありがとう
そのついでにBundled版だけでいいからSqliteのウンコ実装も治ってくれると
いいんだが
巨大なBlob挿入するとBlobTooBigExceptionみたいな例外でたり(2MBまで?)
CursorWindowとか勝手に内部でページングしてひどいことしてる
ほんとうにひどい実装になってるからな
これはandroidのプロセス間通信の制限かなんかでなってるのかしらんが
27: デフォルトの名無しさん [sage] 2024/07/08(月)20:01 ID:2ykBkBhu(1/2)
Model層ではFlow使って、ViewModelではStateを使ってるけど
ViewModelのStateとFlowを合成したいんだけどStateってどうやってListenするの?
もしくはStateをFlowに変換できませんか?
class ViewModel {
var state by mutableStateOf()
fun watch() {
// stateの変化をリッスンしてモデル層のFlowと合成してcollectしたい
}
最初からStateFlowを使えばいいのかもしれんが、なるべくViewModelではStateで統一したい
28: デフォルトの名無しさん [sage] 2024/07/08(月)20:22 ID:2ykBkBhu(2/2)
つか、ちょっと気になった
class HogeViewModel {
@set:JvmName("privateSetHogeState")
var hogeState by mutableStateOf
private set //
fun setHogeState(newValue)
// validationなどのロジック
hogeState = newValue
}
}
名前がぶつかるんだな..
ということでアノテーションつけたけど
これJvm依存か?
29: デフォルトの名無しさん [sage] 2024/09/23(月)22:23 ID:oqrINLn7(1)
derivedStateOfに関する記事、オーバーヘッドが大きいことなど書かれてて興味深い
How derivedStateOf works: a deep d(er)ive
https://blog.zachklipp.com/how-derivedstateof-works-a-deep-d-er-ive/
30(1): デフォルトの名無しさん [sage] 2024/09/25(水)22:51 ID:5Vhwl/nZ(1)
Composeの動画みるとクリーンアーキテクチャばかりつかってるけど
クリーンアーキテクチャがそんなおすすめなの?
31: デフォルトの名無しさん [sage] 2024/09/26(木)11:43 ID:cTJXoivB(1/2)
>>30
クリーンアーキテクチャは
・テストしやすい
・認知されていて誰が見てもわかりやすい
からチーム開発のプロジェクトで人気のアーキテクチャだね
ComposeならクリーンアーキテクチャのMVVMが主流、最近はMVVMのViewModelをPresenterに置き換えたMVPも注目されてる
参考
・クリーンアーキテクチャMVVMのアプリ
https://github.com/DroidKaigi/conference-app-2023
・クリーンアーキテクチャMVPのアプリ
https://github.com/DroidKaigi/conference-app-2024
32(1): デフォルトの名無しさん [sage] 2024/09/26(木)21:37 ID:zQWFDqrj(1)
https://qiita.com/Nabe1216/items/3c321eb04dc396f1579d
ほう
33: デフォルトの名無しさん [sage] 2024/09/26(木)22:10 ID:cTJXoivB(2/2)
>>32
いい感じね
34: デフォルトの名無しさん [sage] 2024/10/16(水)20:52 ID:mtIOo0k6(1)
CMP 1.7.0きたね
35: デフォルトの名無しさん [sage] 2024/10/18(金)22:21 ID:vKy5WG2W(1)
デスクトップのドラッグ アンド ドロップできるようになるのか
36: デフォルトの名無しさん [sage] 2024/10/19(土)09:36 ID:PrnduITI(1/2)
デスクトップ向け配布ってどうなるのこれ
Javaが必要なんだろ
巨大でいいから.netみたく1パッケージでできるのかな
37: デフォルトの名無しさん [sage] 2024/10/19(土)10:43 ID:tkdgpds2(1/2)
デスクトップアプリなら、
CMPで用意されてるgradleコマンドのpackageDistributionForCurrentOS、
あるいはJava標準のjpackageでいけるで
ちゃんとJavaランタイムを同梱した実行可能形式でビルドしてくれる
38(1): デフォルトの名無しさん [sage] 2024/10/19(土)11:00 ID:PrnduITI(2/2)
できるのか
ありがとう
デスクトップアプリを作りたいんだがずっと漂流してて
Flutterはマルチウインドウがまだだし、キーボードフォーカスとか微妙というか変というか
その点Composeの方が新しいからもっと微妙かもしれんけど
39: デフォルトの名無しさん [sage] 2024/10/19(土)13:33 ID:tkdgpds2(2/2)
>>38
Flutterのことはよく知らないけど、
ComposeのデスクトップはJavaのSwingの上にComposeをグラフィックする仕組みで動いてるから、
ウィンドウまわりはかなり安定してるよ
JavaのSwingはJavaで昔からよく使われてきたデスクトップアプリ向けフレームワークね
40: デフォルトの名無しさん [sage] 01/17(金)22:39 ID:EniXNQz7(1)
これは期待
Support multiplatform BackHandler/PredictiveBackHandler. #1771
https://github.com/JetBrains/compose-multiplatform-core/pull/1771
41: デフォルトの名無しさん [sage] 01/25(土)16:23 ID:uQrxkE+r(1)
マルチプラットホームで予測型戻るジェスチャが使えるようになるんけ
42(1): デフォルトの名無しさん [sage] 02/14(金)07:40 ID:NkJp8mwO(1/2)
アルファ版きちゃー
compose multiplatform 1.8.0-alpha03
43: デフォルトの名無しさん [sage] 02/14(金)07:40 ID:NkJp8mwO(2/2)
>>42一応リンク
https://github.com/JetBrains/compose-multiplatform/releases/tag/v1.8.0-alpha03
44: デフォルトの名無しさん [sage] 02/14(金)11:17 ID:iwocV+lv(1)
ロードマップからなんか遅れてるよな
45: デフォルトの名無しさん [sage] 02/14(金)13:36 ID:ZSXOxhZn(1)
予測型戻るジェスチャ機能の追加されたバージョンが出たのか
46: デフォルトの名無しさん [sage] 02/21(金)14:59 ID:jOnV3c4B(1)
iOS向けで、
CMPにおいて戻るジェスチャーが標準でiOSネイティブライクな感じになるようだ
着々とiOSへの対応が公式側で進んでる
Implement iOS default NavHost transition animation close to native. #1861
https://github.com/JetBrains/compose-multiplatform-core/pull/1861
47: デフォルトの名無しさん [sage] 02/22(土)09:43 ID:obzCo2Dh(1)
CMPでホットリロードを可能にするツールを開発中とのこと
すばらしい
https://github.com/JetBrains/compose-hot-reload
https://github.com/JetBrains/compose-hot-reload/releases/tag/v1.0.0-dev-62
48: デフォルトの名無しさん [sage] 02/22(土)10:26 ID:snifUi+R(1)
超期待
49: デフォルトの名無しさん [sage] 02/22(土)14:22 ID:s8vQEMuz(1)
flutterはmacrosでズッコケたからな
50: デフォルトの名無しさん [sage] 04/26(土)11:36 ID:4Jf0lHWD(1)
地味アップグレードきたな
51: デフォルトの名無しさん [] 07/01(火)10:15 ID:1KZwEDte(1)
JetbrainsのCompose MultiplatformとAndroidX Jetpack Composeの統合がついに開始されたね
例えばJetpack Composeのruntimeは統合が完了してクロスプラットフォーム対応になった
52: デフォルトの名無しさん [sage] 07/01(火)19:20 ID:j9smP3T2(1/2)
具体的に何するの?
53: デフォルトの名無しさん [sage] 07/01(火)19:21 ID:j9smP3T2(2/2)
ごめん。例えばって書いてあったね。
54: デフォルトの名無しさん [] 08/08(金)06:52 ID:Fdw9apw5(1)
ComposeにRetainScopesっていうViewModelのライフサイクルを継承したremember関数が実装されるもよう
https://android-review.googlesource.com/c/platform/frameworks/support/+/3452915
`retain { }` API を追加
このCLは、Composeランタイムに`retain { ... }を追加します。
再コンポジションをまたいで値を保持するという点でRememberに似ていますが、保持された値はコンポジション階層の破棄と再作成後も保持できます。これにより、ViewModelやFragmentと同様のスコープが実現されます。
55: デフォルトの名無しさん [sage] 08/08(金)11:21 ID:7cylvkQs(1)
これはQtの対抗馬になりうるの? まだ発展段階だよね
これじゃなくてKotlin/nativeでGUI使うのに成功した人いる?
56: デフォルトの名無しさん [sage] 08/08(金)19:12 ID:1+ZsQpkg(1)
QtはUIライブラリがショボいからな
57: デフォルトの名無しさん [] 08/13(水)09:41 ID:pILUZJEv(1/4)
Kotlin/NativeでComposeのGUIを作製できる対象プラットフォームはいまのところiOSのみで先日安定版に到達した
ComposeのGUIの各プラットフォームでのKotlin/Nativeへの対応はiOSを除けばJVMベースで対応可能ということで後回しになっている
一応、ComposeのGUIを描画するSkiaのKotlinラッパーライブラリのskikoの各プラットフォームでのKotlin/Nativeへの対応はAndroidを除いて完了しているからComposeのGUIは脱JVMへの舵をきれる状態ではある
そのうえで、クロスプラットフォーム対応のGUIフレームワークはどれも一長一短なので、Qt、Compose、Flutter、ウェブ系など好みのものを使えば良い
ただしKotlinで開発するうえで直面していたIDEの選択肢が少ない問題はKotlin LSPのVSCode対応により解決する見込みである
58(1): デフォルトの名無しさん [sage] 08/13(水)14:04 ID:OAhd0lCG(1/5)
KMPはNativeで今のところ共有できないやろ?
Flutterなら例えば複数のOSで同じ共有ライブラリ使えるならFFI経由で共通に出きるけど
59: デフォルトの名無しさん [] 08/13(水)14:34 ID:pILUZJEv(2/4)
>>58
JNIを経由すればよい
公式のSQLiteのKMP実装が参考になる
https://github.com/androidx/androidx/tree/androidx-main/sqlite/sqlite-bundled
60(1): デフォルトの名無しさん [sage] 08/13(水)15:38 ID:OAhd0lCG(2/5)
JNIってJVM環境でないiOSでつかえるのかね..
Flutterならandroidだとうがiosだろうが直接ネいティブの共有ライブラリ呼べるし楽
61(1): デフォルトの名無しさん [sage] 08/13(水)15:44 ID:OAhd0lCG(3/5)
もちろんそんなケース稀かもしれんが
dartならFFIで直接共有ライブラリ関数にバインドできて
c言語介さず呼べるし(osごとのライブラリ名ぐらいは調整して)
dartで最大の不満だった共有メモリマルチスレッドできないのも実験が進んでるっぽいし
62: デフォルトの名無しさん [sage] 08/13(水)15:51 ID:OAhd0lCG(4/5)
UIフレームワーク自体はComposeのほうがいいけど
デフォルトでstateクラスがあって、極力
状態の管理を外だしと徹底してる(例えばメニューの表示/非表示も自分で制御)
63(1): デフォルトの名無しさん [sage] 08/13(水)15:58 ID:OAhd0lCG(5/5)
>Kotlin/Nativeへの対応はAndroidを除いて完了しているからComposeのGUIは脱JVMへの舵をきれる状態ではある
ここは期待したいけど
そもそもandroidアプリはデフォルトがJVM環境だから脱しなくてもいいけど
デスクトップ向けでJVM要求されるのがうっとおしい
64(1): デフォルトの名無しさん [] 08/13(水)18:30 ID:pILUZJEv(3/4)
KMPに関することでありComposeとかけ離れた話になってるからKotlinスレで議論したほうがよいのでしょうけど一応
>>60,61
・59ではJNIによるラップをCで書いているがこれ自体をCではなくKotlin/Nativeで書くことも可能
・Kotlin/Nativeはcinteropを書いて
https://github.com/androidx/androidx/tree/androidx-main/sqlite/sqlite-framework/src/nativeInterop/cinterop
ヘッダーファイルのC関数をKotlinで直接呼べる
https://github.com/androidx/androidx/blob/androidx-main/sqlite/sqlite-framework/src/nativeMain/kotlin/androidx/sqlite/driver/NativeSQLiteStatement.kt
>>63
・KMPでJVM向けアプリケーションを実行形式にビルドするとJavaランタイムを同梱してくれるのでアプリケーションの利用者にJVM環境を求めない
これでよかったでしょうか
ComposeやKMPのことで他に疑問があれば答えられます
65: デフォルトの名無しさん [] 08/13(水)19:12 ID:pILUZJEv(4/4)
>>64に追記で、
JNIによるラップをKotlin/Nativeで書くことができるので、
Cコードの呼び出し等をnativeMainで書いて、それをjniMain(各自命名)で継承し、
そこでnativeMainのKotlin/NativeコードをJNIラップしてやればよい
こういったテクニックを駆使すればC呼び出しを含むコードでも十分に共通化できる
66: デフォルトの名無しさん [sage] 08/14(木)17:44 ID:g00bnU7h(1)
1.9キター
ってロードマップ更新しろよ
67: デフォルトの名無しさん [] 08/14(木)22:45 ID:mhSblWPk(1)
1.9で追加されたrememberSerializableが便利だ
68: デフォルトの名無しさん [] 08/18(月)19:15 ID:Gfjo7mYU(1)
今年もDroidKaigiの季節がやってきたね
今年もViewModel不採用のアーキテクチャ
https://github.com/DroidKaigi/conference-app-2025
69(2): デフォルトの名無しさん [sage] 08/18(月)19:40 ID:/HMywgCQ(1)
MVVMでいいと思う
最大の問題は大きなメリットもないのにflutterとかUIフレームワークごとに
別のアーキテクチャ覚えさせるの?
まさしく時間の無駄だし
70: デフォルトの名無しさん [] 08/19(火)00:25 ID:9Ur9ADeh(1/5)
>>69
68のはMVVMを捨ててReactでよく使われるようなMVPに近づけて、むしろWeb系フレンドリーを目指してるから受け入れられやすい
71: デフォルトの名無しさん [] 08/19(火)00:33 ID:9Ur9ADeh(2/5)
世界で一番多いフロントエンジニアはWeb系だからそれらの書き方に似せるのは賢いなと思った
72: デフォルトの名無しさん [] 08/19(火)08:08 ID:9Ur9ADeh(3/5)
>>69
追記で
ComposeフレームワークはUIレンダリングとしての役割のほかに状態管理ランタイムとしての役割も有していて
ViewModelによる状態管理がComposeフレームワーク上で不要なのではと言われている
参考記事
https://zenn.dev/rockname/articles/2a7db5ac4bb516
具体的には
Composeアプリ開発におけるViewModelはandroidx.lifecycle.ViewModelライブラリとしての独自の特殊なライフサイクルを有していて
Composeと異なるライフサイクルのため
ViewModelとComposeのそれぞれで状態管理をしていて状態の保持が点在する問題があって
この問題を解決するためにViewModel自体をComposableに書き直してしまおうとなり
それならViewModelよりPresenterで状態管理するほうが自然に書けるねってなった
ComposeではAndroidにおけるアクティビティの再生成による状態のリセットの特殊性が健在でFlutterとは事情が異なる
73: デフォルトの名無しさん [] 08/19(火)15:40 ID:9Ur9ADeh(4/5)
droidkaigi2025デスクトップアプリを起動してみたがボトムバーがiOS26のタブバーのような見た目だ
今後はこういうフローティングバーが流行るのだろうか
https://i.imgur.com/u4aobGF.jpeg
74: デフォルトの名無しさん [sage] 08/19(火)15:42 ID:OfjY9UJ1(1)
material expressiveのフローティングツールバーでしょ
75: デフォルトの名無しさん [] 08/19(火)20:55 ID:9Ur9ADeh(5/5)
それはツールバーっしょ
m3exressiveのナビゲーションバーはドックのしかない
76: デフォルトの名無しさん [] 09/02(火)23:42 ID:BG74jSL6(1)
たまたまiOSライクなフローティングタブバーのComposeの実装例を見つけたから貼っとくぞ
https://github.com/elyesmansour/compose-floating-tab-bar
https://raw.githubusercontent.com/elyesmansour/compose-floating-tab-bar/main/assets/demo.gif
77: デフォルトの名無しさん [sage] 09/06(土)12:49 ID:fnthT/PT(1)
普及なかなか進んでないな
78(1): デフォルトの名無しさん [] 09/06(土)13:14 ID:rmxBGTZh(1)
AmazonがComposeを好んで一部製品に使ってアピールしてるから、普及はこれからな気もする
ReactNativeで良い感は否めないけど
79(1): デフォルトの名無しさん [sage] 09/13(土)16:45 ID:suFi3JuE(1)
>>78
何に使ってるの?
80(1): デフォルトの名無しさん [] 09/13(土)21:35 ID:bqa2q9pe(1)
>>79
https://amzn.github.io/app-platform/faq/#is-app-platform-used-in-production-by-amazon
81: デフォルトの名無しさん [sage] 09/14(日)20:47 ID:GM0TlpuE(1)
>>80
なるほどねー
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.489s*