Skip to content

Latest commit

 

History

History
78 lines (56 loc) · 2.77 KB

File metadata and controls

78 lines (56 loc) · 2.77 KB

moon-firestore-sync-kmp 統合ガイド

moon-sync-kmp が提供する L1 RemoteStore SPI の Firestore 実装です。 プラットフォーム固有のコードなしに Firestore コレクションを Kotlin Flow として購読できます。

1. 前提条件

  • Kotlin 2.0.20、Compose Multiplatform 1.7.x、AGP 8.6.x、Gradle 8.10、Java 21。
  • Firestore を有効化した Firebase プロジェクト (セキュリティルール設定済み)。
  • 有効な moonLicenseKey
  • Koin 4.1.0。

2. リポジトリと依存関係を追加

(リポジトリ設定は auth モジュールと同じです。auth/ja.md §2 を参照。)

composeApp/build.gradle.kts (commonMain):

implementation("io.moondeveloper:moon-firestore-sync-kmp:1.0.0")

3. プラットフォーム設定

Android

  • google-services.json を配置し、Google Services プラグインを適用。
  • Firestore は FirebaseApp 初期化時に同時に初期化されます (通常は自動)。

iOS

  • Xcode ターゲットに GoogleService-Info.plist を追加。
  • AppDelegateFirebaseApp.configure() を呼び出します。

4. Koin を初期化

import io.moondev.firestore.sync.firestoreSyncModule

startKoin {
    modules(firestoreSyncModule /*, ... */)
}

モジュール内部で FirestoreRemoteStoreRemoteStore にバインドされるため、 機能コードからは RemoteStore のみが見えます。

5. ViewModel / Store (MVI) で利用

class NotesStore(private val store: RemoteStore) {
    val notes: Flow<List<Note>> = store.observeCollection("notes")
}

6. Compose UI へのバインド

@Composable
fun NotesScreen(store: NotesStore = koinInject()) {
    val items by store.notes.collectAsState(initial = emptyList())
    LazyColumn { items(items) { n -> Text(n.title) } }
}

7. よくある問題

  • 空のストリーム / PERMISSION_DENIED — Firestore ルールがリクエストを拒否しています。 ユーザーがサインイン済みか (moon-firebase-auth-kmp と併用)、パスがルールと 合致しているかを確認してください。
  • iOS の Default FirebaseApp is not initializedAppDelegate での FirebaseApp.configure() 呼び出しが抜けています。
  • ログのバックプレッシャー警告 — ストリームは hot です。ViewModel や Compose の LaunchedEffect にスコープを限定して破棄時にキャンセルしてください。

8. 次のステップ