/** * 第 10 章配套代码 · 全局 Store 集合 * * 文件位置:shared/src/commonMain/kotlin/com/example/xhs/store/Stores.kt * * 演示如何用全局 object 装 observable 字段,实现「跨 Pager 状态共享」。 * * 类比:Vue Pinia / React Zustand / Android ViewModel + StateFlow */ package com.example.xhs.store import com.example.xhs.api.NoteApi import com.example.xhs.pages.Note import com.tencent.kuikly.core.module.SharedPreferencesModule import com.tencent.kuikly.core.module.ToastModule import com.tencent.kuikly.core.pager.Pager import com.tencent.kuikly.core.reactive.collection.observableListOf import com.tencent.kuikly.core.reactive.handler.observable // ═══════════════════════════════════════════════════════════════════ // 用户 Store // ═══════════════════════════════════════════════════════════════════ object UserStore { var loggedIn by observable(false) var userId by observable("") var nickname by observable("") var avatar by observable("") var bio by observable("") var followingCount by observable(0) var followersCount by observable(0) var likesCount by observable(0) fun login(uid: String, name: String, av: String, b: String = "") { userId = uid nickname = name avatar = av bio = b loggedIn = true } fun logout() { loggedIn = false userId = ""; nickname = ""; avatar = ""; bio = "" followingCount = 0; followersCount = 0; likesCount = 0 } } // ═══════════════════════════════════════════════════════════════════ // 主题 Store // ═══════════════════════════════════════════════════════════════════ object ThemeStore { var darkMode by observable(false) fun toggle() { darkMode = !darkMode } } // ═══════════════════════════════════════════════════════════════════ // 笔记 Store // ═══════════════════════════════════════════════════════════════════ object NoteStore { val notes = observableListOf() var loading by observable(false) var page = 1 var hasMore by observable(true) fun refresh(onDone: () -> Unit = {}) { if (loading) return loading = true page = 1 NoteApi.fetchNotes(page = 1) { list -> notes.clear() notes.addAll(list) hasMore = list.isNotEmpty() loading = false onDone() } } fun loadMore(onDone: () -> Unit = {}) { if (loading || !hasMore) return loading = true page++ NoteApi.fetchNotes(page) { list -> if (list.isEmpty()) { hasMore = false } else { notes.addAll(list) } loading = false onDone() } } /** * 切换某条笔记的点赞态:演示 data class.copy() 替换 item */ fun toggleLike(noteId: String) { val idx = notes.indexOfFirst { it.id == noteId } if (idx < 0) return val n = notes[idx] notes[idx] = n.copy( liked = !n.liked, likes = if (n.liked) n.likes - 1 else n.likes + 1, ) } } // ═══════════════════════════════════════════════════════════════════ // Tab Store // ═══════════════════════════════════════════════════════════════════ object TabStore { var currentTab by observable("home") }