diff --git a/.gitignore b/.gitignore
index 29236b9..83f4053 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@ local.properties
/.idea/
/android-project-compose-docs/
/context/
+/blog_post.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0b0439b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,161 @@
+
+
+

+
+# AndroidProject-Compose
+
+_一个 Android 快速开发框架_
+
+
+
+
+[](https://github.com/Joker-x-dev/AndroidProject-Compose)
+[](https://gitee.com/Joker-x-dev/AndroidProject-Compose)
+[](https://www.pgyer.com/AndroidProject-Compose)
+[](https://compose.dusksnow.top)
+[](https://deepwiki.com/Joker-x-dev/AndroidProject-Compose)
+
+
+
+## 📖 项目简介
+
+AndroidProject-Compose 是一个包含网络、状态、导航、主题、数据存储、数据库等基础能力的 **Jetpack Compose 单模块脚手架**,并提供少量功能示例页面,方便你“拉仓库 → 运行 → 填业务”地快速搭建或学习现代 Compose 应用。
+
+> 如果项目对您有帮助,请给个 Star 支持 ⭐ 这对我来说很重要,能给我带来长期更新维护的动力!
+
+## 📱 项目预览
+
+
+
+### 📍 项目地址
+
+- **GitHub 地址**:[https://github.com/Joker-x-dev/AndroidProject-Compose](https://github.com/Joker-x-dev/AndroidProject-Compose)
+- **Gitee 地址**:[https://gitee.com/Joker-x-dev/AndroidProject-Compose](https://gitee.com/Joker-x-dev/AndroidProject-Compose)
+
+> 本脚手架源于青商城的实践,仅保留基础能力与功能示例;完整电商业务与全量 UI/动效/完整业务示例请查看青商城:GitHub https://github.com/Joker-x-dev/CoolMallKotlin | Gitee https://gitee.com/Joker-x-dev/CoolMallKotlin
+
+### Demo 下载
+
+**Release 版本(2MB)**:[点击下载体验](https://www.pgyer.com/AndroidProject-Compose)
+- **支持系统**:Android 6.0 及以上
+- **更新说明**:预览版本会不定时更新,可能不会完全同步最新的代码变更
+
+### 说明文档
+
+- **说明文档**:[在线查看](https://compose.dusksnow.top)
+- **说明**:与代码同步的在线文档,包含快速开始、架构说明、示例路由、常见定制点等,便于理解项目与学习。
+
+## 🛠️ 技术栈
+
+### 核心技术
+
+| 类别 | 技术选型 | 版本号 | 说明 |
+|-------|---------------------------|------------|-------------------|
+| 编程语言 | Kotlin | 2.2.21 | 100% Kotlin 开发 |
+| UI 框架 | Jetpack Compose | 2025.11.01 | 声明式 UI 框架 |
+| 依赖注入 | Hilt | 2.57.2 | 基于 Dagger 的依赖注入框架 |
+
+### 功能模块
+
+| 类别 | 技术选型 | 版本号 | 说明 |
+|-------|-----------------------|---------------|------------------|
+| 导航 | Navigation Compose | 2.9.6 | Compose 导航组件 |
+| 网络请求 | Retrofit + OkHttp | 3.0.0 + 5.3.2 | HTTP 客户端 |
+
+### 数据存储
+
+| 类别 | 技术选型 | 版本号 | 说明 |
+|------|------|-------|------------|
+| 数据库 | Room | 2.8.4 | SQLite 数据库 |
+| 本地存储 | MMKV | 2.2.4 | 高性能键值存储 |
+
+### 开发工具
+
+| 类别 | 技术选型 | 版本号 | 说明 |
+|------|---------------|--------|-------------|
+| 日志框架 | Timber | 5.0.1 | 日志管理 |
+| 网络调试 | Chucker | 4.2.0 | 网络请求监控 |
+| 内存检测 | LeakCanary | 2.14 | 内存泄漏检测 |
+
+## 📱 功能模块目录
+
+- **主模块 (main)**
+ - 主页面 (main)
+ - 基础能力示例 (core-demo)
+ - 导航示例 (navigation-demo)
+
+
+- **认证模块 (auth)**
+ - 登录页 (login)
+
+
+- **用户模块 (user)**
+ - 用户信息 (info)
+
+
+- **示例模块 (demo)**
+ - 通用网络请求示例 (network-demo)
+ - 通用分页列表示例 (network-list-demo)
+ - 数据库示例 (database)
+ - 本地存储示例 (local-storage)
+ - 状态管理示例 (state-management)
+ - 网络请求示例 (network-request)
+ - 带参跳转示例 (navigation-with-args)
+ - 结果回传示例 (navigation-result)
+
+## 项目结构
+
+```
+├── app/ # 应用入口
+├── core/ # 核心
+│ ├── base/ # 基础抽象
+│ ├── data/ # 数据层
+│ ├── database/ # 数据库
+│ ├── datastore/ # 数据存储
+│ ├── designsystem/ # 设计系统
+│ ├── model/ # 数据模型
+│ ├── network/ # 网络层
+│ ├── result/ # 结果处理
+│ ├── state/ # 状态管理
+│ ├── ui/ # UI 组件
+│ └── util/ # 工具类
+├── navigation/ # 导航模块
+│ ├── routes/ # 路由定义
+│ ├── results/ # 路由返回结果
+│ └── extension/ # 导航扩展
+├── feature/ # 功能模块
+│ ├── main/ # 主模块
+│ ├── auth/ # 认证模块
+│ ├── user/ # 用户模块
+│ └── demo/ # 示例模块
+└── MainActivityViewModel.kt # 宿主级共享 ViewModel
+```
+
+## 👥 加入群聊
+
+欢迎加入开发者交流群,一起分享学习心得,讨论技术问题!
+
+
+

+
扫码或搜索群号加入 QQ 群
+
+
+## 🤝 参与贡献
+
+这是一个开放的学习项目,欢迎所有对 Android 开发感兴趣的开发者参与贡献!
+
+### 🎯 贡献方式
+
+- **代码贡献**: 提交 Pull Request,完善功能实现或修复问题
+- **问题反馈**: 通过 Issue 报告 Bug 或提出功能建议
+- **文档优化**: 完善项目文档、添加使用说明或开发指南
+- **设计支持**: 提供 UI/UX 设计建议或素材资源
+- **测试协助**: 参与功能测试,提供使用反馈和改进建议
+
+### 📋 贡献指南
+
+- 提交代码前请确保遵循项目的编码规范
+- 新功能开发建议先创建 Issue 讨论可行性
+- 欢迎分享学习心得和技术总结
diff --git a/README_EN.md b/README_EN.md
new file mode 100644
index 0000000..4f8d227
--- /dev/null
+++ b/README_EN.md
@@ -0,0 +1,158 @@
+
+
+

+
+# AndroidProject-Compose
+
+_A fast-start Android framework built with Jetpack Compose_
+
+
+
+
+[](https://github.com/Joker-x-dev/AndroidProject-Compose)
+[](https://gitee.com/Joker-x-dev/AndroidProject-Compose)
+[](https://www.pgyer.com/AndroidProject-Compose)
+[](https://compose.dusksnow.top)
+[](https://deepwiki.com/Joker-x-dev/AndroidProject-Compose)
+
+
+
+## 📖 Project Overview
+
+AndroidProject-Compose is a **single-module Jetpack Compose scaffold** that ships with the essential building blocks for networking, state, navigation, theming, data storage, and database access. It also includes a few feature demo pages so you can “clone → run → plug in your business logic” to quickly build or learn a modern Compose app.
+
+> If this project helps you, please give it a Star ⭐ It means a lot and keeps me motivated to maintain and update the project long-term!
+
+## 📱 Preview
+
+
+
+### 📍 Project Links
+
+- **GitHub**: [https://github.com/Joker-x-dev/AndroidProject-Compose](https://github.com/Joker-x-dev/AndroidProject-Compose)
+- **Gitee**: [https://gitee.com/Joker-x-dev/AndroidProject-Compose](https://gitee.com/Joker-x-dev/AndroidProject-Compose)
+
+> This scaffold originates from the CoolMall practice project and keeps only the foundational capabilities plus sample pages. For the full e-commerce business, complete UI/animations, and full-featured demos, see CoolMall: GitHub https://github.com/Joker-x-dev/CoolMallKotlin | Gitee https://gitee.com/Joker-x-dev/CoolMallKotlin
+
+### Demo Download
+
+**Release build (2MB)**: [Download](https://www.pgyer.com/AndroidProject-Compose)
+- **Supported OS**: Android 6.0 and above
+- **Release notes**: Preview builds update occasionally and may not always reflect the latest code changes
+
+### Documentation
+
+- **Docs**: [View online](https://compose.dusksnow.top)
+- **Note**: Online docs stay in sync with the code and cover quick start, architecture, sample routes, common customization points, and more.
+
+## 🛠️ Tech Stack
+
+### Core Technologies
+
+| Category | Technology | Version | Description |
+|-----------------------|---------------------|------------|------------------------------|
+| Programming Language | Kotlin | 2.2.21 | 100% Kotlin |
+| UI Framework | Jetpack Compose | 2025.11.01 | Declarative UI framework |
+| Dependency Injection | Hilt | 2.57.2 | Dagger-based DI framework |
+
+### Feature Modules
+
+| Category | Technology | Version | Description |
+|------------|------------------------|---------------|---------------------------|
+| Navigation | Navigation Compose | 2.9.6 | Compose navigation |
+| Network | Retrofit + OkHttp | 3.0.0 + 5.3.2 | HTTP client |
+
+### Data Storage
+
+| Category | Technology | Version | Description |
+|---------------|------------|---------|----------------------------------|
+| Database | Room | 2.8.4 | SQLite database |
+| Local Storage | MMKV | 2.2.4 | High-performance key-value store |
+
+### Development Tools
+
+| Category | Technology | Version | Description |
+|-------------------|------------|---------|------------------------|
+| Logging | Timber | 5.0.1 | Log management |
+| Network Debugging | Chucker | 4.2.0 | Network request monitor|
+| Memory Leak Check | LeakCanary | 2.14 | Memory leak detection |
+
+## 📱 Feature Module Directory
+
+- **Main Module (main)**
+ - Main page (main)
+ - Core capability demos (core-demo)
+ - Navigation demos (navigation-demo)
+
+- **Auth Module (auth)**
+ - Login (login)
+
+- **User Module (user)**
+ - User info (info)
+
+- **Demo Module (demo)**
+ - Generic network request demo (network-demo)
+ - Generic paged list demo (network-list-demo)
+ - Database demo (database)
+ - Local storage demo (local-storage)
+ - State management demo (state-management)
+ - Network request demo (network-request)
+ - Navigation with args (navigation-with-args)
+ - Navigation result passing (navigation-result)
+
+## Project Structure
+
+```
+├── app/ # App entry
+├── core/ # Core
+│ ├── base/ # Base abstractions
+│ ├── data/ # Data layer
+│ ├── database/ # Database
+│ ├── datastore/ # Data storage
+│ ├── designsystem/ # Design system
+│ ├── model/ # Data models
+│ ├── network/ # Network layer
+│ ├── result/ # Result handling
+│ ├── state/ # State management
+│ ├── ui/ # UI components
+│ └── util/ # Utilities
+├── navigation/ # Navigation module
+│ ├── routes/ # Route definitions
+│ ├── results/ # Route results
+│ └── extension/ # Navigation extensions
+├── feature/ # Feature modules
+│ ├── main/ # Main module
+│ ├── auth/ # Auth module
+│ ├── user/ # User module
+│ └── demo/ # Demo module
+└── MainActivityViewModel.kt # Host-level shared ViewModel
+```
+
+## 👥 Join the Community
+
+Welcome to the developer group—share learning notes and discuss technical questions together!
+
+
+

+
Scan or search the group number to join the QQ group
+
+
+## 🤝 Contributing
+
+This is an open learning project. All Android enthusiasts are welcome to contribute!
+
+### 🎯 How to Contribute
+
+- **Code Contributions**: Submit pull requests to improve features or fix issues
+- **Issue Feedback**: Report bugs or suggest features via Issues
+- **Documentation**: Enhance docs, add usage guides or developer guides
+- **Design Support**: Provide UI/UX suggestions or assets
+- **Testing Help**: Join feature testing and share feedback
+
+### 📋 Contribution Guidelines
+
+- Please follow the project coding conventions before submitting code
+- For new features, create an Issue first to discuss feasibility
+- Sharing learning notes and technical takeaways is encouraged
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 4bb46a7..20ce740 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -20,8 +20,13 @@
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-# toast 混淆规则
--keep class com.hjq.toast.** {*;}
-
-# xxp权限混淆规则
--keep class com.hjq.permissions.** { *; }
\ No newline at end of file
+# xxp权限混淆规则 地址: https://github.com/getActivity/XXPermissions/blob/master/library/proguard-permissions.pro
+-keepclassmembers interface com.hjq.permissions.start.IStartActivityDelegate {
+ ;
+}
+-keepclassmembers interface com.hjq.permissions.fragment.IFragmentMethodNative {
+ ;
+}
+-keepclassmembers class androidx.fragment.app.Fragment {
+ androidx.fragment.app.FragmentActivity getActivity();
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/joker/kit/core/model/entity/User.kt b/app/src/main/java/com/joker/kit/core/model/entity/User.kt
index 60b434a..874c5e4 100644
--- a/app/src/main/java/com/joker/kit/core/model/entity/User.kt
+++ b/app/src/main/java/com/joker/kit/core/model/entity/User.kt
@@ -1,5 +1,7 @@
package com.joker.kit.core.model.entity
+import androidx.annotation.Keep
+
import kotlinx.serialization.Serializable
/**
@@ -18,6 +20,7 @@ import kotlinx.serialization.Serializable
* @param updateTime 更新时间
* @author Joker.X
*/
+@Keep
@Serializable
data class User(
diff --git a/app/src/main/java/com/joker/kit/core/model/network/NetworkResponse.kt b/app/src/main/java/com/joker/kit/core/model/network/NetworkResponse.kt
index bd51928..1ec4271 100644
--- a/app/src/main/java/com/joker/kit/core/model/network/NetworkResponse.kt
+++ b/app/src/main/java/com/joker/kit/core/model/network/NetworkResponse.kt
@@ -1,5 +1,7 @@
package com.joker.kit.core.model.network
+import androidx.annotation.Keep
+
import kotlinx.serialization.Serializable
/**
@@ -11,6 +13,7 @@ import kotlinx.serialization.Serializable
* @param message 出错的提示信息
* @author Joker.X
*/
+@Keep
@Serializable
data class NetworkResponse(
/**
diff --git a/app/src/main/java/com/joker/kit/core/network/service/UserInfoService.kt b/app/src/main/java/com/joker/kit/core/network/service/UserInfoService.kt
index 2bda532..d983e26 100644
--- a/app/src/main/java/com/joker/kit/core/network/service/UserInfoService.kt
+++ b/app/src/main/java/com/joker/kit/core/network/service/UserInfoService.kt
@@ -1,5 +1,7 @@
package com.joker.kit.core.network.service
+import androidx.annotation.Keep
+
import com.joker.kit.core.model.entity.User
import com.joker.kit.core.model.network.NetworkResponse
import retrofit2.http.GET
@@ -9,6 +11,7 @@ import retrofit2.http.GET
*
* @author Joker.X
*/
+@Keep
interface UserInfoService {
/**
diff --git a/app/src/main/java/com/joker/kit/core/state/DemoCounterState.kt b/app/src/main/java/com/joker/kit/core/state/DemoCounterState.kt
index d463dd9..bc6038f 100644
--- a/app/src/main/java/com/joker/kit/core/state/DemoCounterState.kt
+++ b/app/src/main/java/com/joker/kit/core/state/DemoCounterState.kt
@@ -23,12 +23,17 @@ class DemoCounterState @Inject constructor(
/**
* 计数器值
+ *
+ * @return 计数器 StateFlow
+ * @author Joker.X
*/
private val _count = MutableStateFlow(0)
val count: StateFlow = _count.asStateFlow()
/**
* +1
+ *
+ * @author Joker.X
*/
fun increase() {
appScope.launch {
@@ -38,6 +43,8 @@ class DemoCounterState @Inject constructor(
/**
* -1,最低为 0
+ *
+ * @author Joker.X
*/
fun decrease() {
appScope.launch {
@@ -47,6 +54,8 @@ class DemoCounterState @Inject constructor(
/**
* 重置
+ *
+ * @author Joker.X
*/
fun reset() {
appScope.launch {
diff --git a/app/src/main/java/com/joker/kit/core/state/UserState.kt b/app/src/main/java/com/joker/kit/core/state/UserState.kt
index 4575891..a2703e4 100644
--- a/app/src/main/java/com/joker/kit/core/state/UserState.kt
+++ b/app/src/main/java/com/joker/kit/core/state/UserState.kt
@@ -182,4 +182,4 @@ class UserState @Inject constructor(
}
)
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/joker/kit/core/state/di/AppStateModule.kt b/app/src/main/java/com/joker/kit/core/state/di/AppStateModule.kt
index 3fe44d8..68bbe92 100644
--- a/app/src/main/java/com/joker/kit/core/state/di/AppStateModule.kt
+++ b/app/src/main/java/com/joker/kit/core/state/di/AppStateModule.kt
@@ -12,6 +12,8 @@ import javax.inject.Singleton
/**
* 应用状态模块,提供应用级协程作用域
+ *
+ * @author Joker.X
*/
@Module
@InstallIn(SingletonComponent::class)
@@ -20,6 +22,9 @@ object AppStateModule {
/**
* 提供应用级别的协程作用域
* SupervisorJob 确保子协程失败不会终止整个作用域
+ *
+ * @return 应用级 CoroutineScope
+ * @author Joker.X
*/
@ApplicationScope
@Singleton
@@ -31,6 +36,8 @@ object AppStateModule {
/**
* 应用级协程作用域限定符
+ *
+ * @author Joker.X
*/
@Retention(AnnotationRetention.RUNTIME)
@Qualifier
diff --git a/app/src/main/java/com/joker/kit/feature/auth/viewmodel/LoginViewModel.kt b/app/src/main/java/com/joker/kit/feature/auth/viewmodel/LoginViewModel.kt
index 48c9e9b..38cd8b9 100644
--- a/app/src/main/java/com/joker/kit/feature/auth/viewmodel/LoginViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/auth/viewmodel/LoginViewModel.kt
@@ -30,6 +30,8 @@ class LoginViewModel @Inject constructor(
/**
* 模拟登录:构造假的 Auth/User,写入 UserState,演示路由拦截放行。
* 真实项目中,这里会是网络请求,登录成功后会有 token 等信息返回。
+ *
+ * @author Joker.X
*/
fun login() {
viewModelScope.launch {
@@ -52,6 +54,8 @@ class LoginViewModel @Inject constructor(
/**
* 模拟退出登录,清空全局 UserState
+ *
+ * @author Joker.X
*/
fun logout() {
viewModelScope.launch {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/DatabaseNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/DatabaseNavigation.kt
index 81ec31a..5fffbb4 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/DatabaseNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/DatabaseNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* 数据库示例页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.databaseScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/DemoGraph.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/DemoGraph.kt
index ac99f88..7331d22 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/DemoGraph.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/DemoGraph.kt
@@ -7,6 +7,10 @@ import androidx.navigation.NavHostController
/**
* Demo 模块导航图
+ *
+ * @param navController 导航控制器
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.demoGraph(
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/LocalStorageNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/LocalStorageNavigation.kt
index b18f21d..bcd31cd 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/LocalStorageNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/LocalStorageNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* 本地存储示例页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.localStorageScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationResultNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationResultNavigation.kt
index d03ed7d..1739d80 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationResultNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationResultNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* 结果回传示例页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.navigationResultScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationWithArgsNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationWithArgsNavigation.kt
index e39bbd5..eb29677 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationWithArgsNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/NavigationWithArgsNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* 带参跳转示例页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.navigationWithArgsScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkDemoNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkDemoNavigation.kt
index 4121aa3..09a1afb 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkDemoNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkDemoNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* Network Demo 页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.networkDemoScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkListDemoNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkListDemoNavigation.kt
index 2e2975b..6f9b5e2 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkListDemoNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkListDemoNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* Network List Demo 页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.networkListDemoScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkRequestNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkRequestNavigation.kt
index 968bb2d..3cb1127 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkRequestNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/NetworkRequestNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* 网络请求示例页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.networkRequestScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/navigation/StateManagementNavigation.kt b/app/src/main/java/com/joker/kit/feature/demo/navigation/StateManagementNavigation.kt
index 3be3695..e2f4ca3 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/navigation/StateManagementNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/navigation/StateManagementNavigation.kt
@@ -9,6 +9,9 @@ import com.joker.kit.navigation.routes.DemoRoutes
/**
* 状态管理示例页面导航
+ *
+ * @param sharedTransitionScope 共享转场作用域
+ * @author Joker.X
*/
@OptIn(ExperimentalSharedTransitionApi::class)
fun NavGraphBuilder.stateManagementScreen(sharedTransitionScope: SharedTransitionScope) {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/DatabaseScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/DatabaseScreen.kt
index 404a68b..f5cdfe5 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/DatabaseScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/DatabaseScreen.kt
@@ -53,6 +53,7 @@ import java.util.Locale
* 数据库示例路由
*
* @param viewModel Hilt 注入的 DatabaseViewModel
+ * @author Joker.X
*/
@Composable
internal fun DatabaseRoute(
@@ -90,6 +91,7 @@ internal fun DatabaseRoute(
* @param onDeleteItem 删除指定记录
* @param onClearAll 清空所有记录
* @param onBackClick 返回按钮回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -132,6 +134,7 @@ internal fun DatabaseScreen(
* @param onAddClick 新增记录回调
* @param onDeleteItem 删除记录回调
* @param onClearAll 清空列表回调
+ * @author Joker.X
*/
@Composable
private fun DatabaseContent(
@@ -177,6 +180,7 @@ private fun DatabaseContent(
* @param onAddClick 新增记录
* @param onClearAll 清空全部
* @param canClear 是否允许清空按钮启用
+ * @author Joker.X
*/
@Composable
private fun InputCard(
@@ -249,6 +253,7 @@ private fun InputCard(
*
* @param items Demo 数据列表
* @param onDeleteItem 删除单条记录回调
+ * @author Joker.X
*/
@Composable
private fun DemoListCard(
@@ -298,6 +303,7 @@ private fun DemoListCard(
*
* @param item Demo 实体
* @param onDeleteItem 删除该条记录回调
+ * @author Joker.X
*/
@Composable
private fun DemoListItem(
@@ -337,6 +343,8 @@ private fun DemoListItem(
/**
* 数据库界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -352,6 +360,8 @@ private fun DatabasePreview() {
/**
* 数据库界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -367,6 +377,9 @@ private fun DatabasePreviewDark() {
/**
* 预览用 Demo 数据
+ *
+ * @return 示例数据列表
+ * @author Joker.X
*/
private fun previewDemoItems() = listOf(
DemoEntity(id = 1, title = "演示标题 A", description = "这是第一条记录"),
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/LocalStorageScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/LocalStorageScreen.kt
index ac945d1..79a872f 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/LocalStorageScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/LocalStorageScreen.kt
@@ -42,6 +42,7 @@ import com.joker.kit.feature.demo.viewmodel.LocalStorageViewModel
* 本地存储示例路由
*
* @param viewModel Hilt 注入的 LocalStorageViewModel
+ * @author Joker.X
*/
@Composable
internal fun LocalStorageRoute(
@@ -85,6 +86,7 @@ internal fun LocalStorageRoute(
* @param onClearUser 清除用户信息
* @param onReloadUser 重新读取用户信息
* @param onBackClick 返回按钮回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -104,7 +106,6 @@ internal fun LocalStorageScreen(
AppScaffold(
titleText = "本地存储",
onBackClick = onBackClick,
- contentShouldConsumePadding = true
) {
LocalStorageContent(
userId = userId,
@@ -134,6 +135,7 @@ internal fun LocalStorageScreen(
* @param onSaveUser 保存用户
* @param onClearUser 清除用户
* @param onReloadUser 重新读取用户
+ * @author Joker.X
*/
@Composable
private fun LocalStorageContent(
@@ -183,6 +185,7 @@ private fun LocalStorageContent(
* @param onSaveUser 保存用户
* @param onClearUser 清除用户
* @param onReloadUser 重新读取用户
+ * @author Joker.X
*/
@Composable
private fun UserCard(
@@ -269,6 +272,8 @@ private fun UserCard(
/**
* 本地存储界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -285,6 +290,8 @@ private fun LocalStoragePreview() {
/**
* 本地存储界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/NavigationResultScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/NavigationResultScreen.kt
index c31d0f6..0f29278 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/NavigationResultScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/NavigationResultScreen.kt
@@ -17,6 +17,9 @@ import com.joker.kit.feature.demo.viewmodel.NavigationResultViewModel
/**
* 结果回传示例路由
+ *
+ * @param viewModel Hilt 注入的 NavigationResultViewModel
+ * @author Joker.X
*/
@Composable
internal fun NavigationResultRoute(
@@ -31,7 +34,9 @@ internal fun NavigationResultRoute(
/**
* 结果回传示例界面
*
+ * @param onSendResult 发送结果并返回回调
* @param onBackClick 返回按钮回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -49,6 +54,9 @@ internal fun NavigationResultScreen(
/**
* 结果回传内容视图
+ *
+ * @param onSendResult 发送结果回调
+ * @author Joker.X
*/
@Composable
private fun NavigationResultContent(onSendResult: () -> Unit) {
@@ -64,6 +72,8 @@ private fun NavigationResultContent(onSendResult: () -> Unit) {
/**
* 结果回传界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -75,6 +85,8 @@ private fun NavigationResultPreview() {
/**
* 结果回传界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/NavigationWithArgsScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/NavigationWithArgsScreen.kt
index a3413d2..b15d641 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/NavigationWithArgsScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/NavigationWithArgsScreen.kt
@@ -11,6 +11,9 @@ import com.joker.kit.feature.demo.viewmodel.NavigationWithArgsViewModel
/**
* 带参跳转示例路由
+ *
+ * @param viewModel Hilt 注入的 NavigationWithArgsViewModel
+ * @author Joker.X
*/
@Composable
internal fun NavigationWithArgsRoute(
@@ -25,7 +28,9 @@ internal fun NavigationWithArgsRoute(
/**
* 带参跳转示例界面
*
+ * @param goodsId 传入的商品 ID
* @param onBackClick 返回按钮回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -43,6 +48,9 @@ internal fun NavigationWithArgsScreen(
/**
* 带参跳转内容视图
+ *
+ * @param goodsId 传入的商品 ID
+ * @author Joker.X
*/
@Composable
private fun NavigationWithArgsContent(goodsId: Long) {
@@ -51,6 +59,8 @@ private fun NavigationWithArgsContent(goodsId: Long) {
/**
* 带参跳转界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -62,6 +72,8 @@ private fun NavigationWithArgsPreview() {
/**
* 带参跳转界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/NetworkDemoScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/NetworkDemoScreen.kt
index 1c450ea..9dd011a 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/NetworkDemoScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/NetworkDemoScreen.kt
@@ -20,6 +20,9 @@ import com.joker.kit.feature.demo.viewmodel.NetworkDemoViewModel
/**
* Network Demo 路由
+ *
+ * @param viewModel Hilt 注入的 NetworkDemoViewModel
+ * @author Joker.X
*/
@Composable
internal fun NetworkDemoRoute(
@@ -41,6 +44,7 @@ internal fun NetworkDemoRoute(
* @param uiState UI 状态
* @param onBackClick 返回按钮回调
* @param onRetry 重试回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -66,6 +70,7 @@ internal fun NetworkDemoScreen(
* Network Demo 内容视图
*
* @param data 商品数据
+ * @author Joker.X
*/
@Composable
private fun NetworkDemoContent(data: Goods) {
@@ -79,6 +84,8 @@ private fun NetworkDemoContent(data: Goods) {
/**
* Network Demo 界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -90,6 +97,8 @@ private fun NetworkDemoPreview() {
/**
* Network Demo 界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -101,6 +110,9 @@ private fun NetworkDemoPreviewDark() {
/**
* 模拟商品数据
+ *
+ * @return 示例商品
+ * @author Joker.X
*/
private fun mockGoods() = Goods(
id = 1,
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/NetworkListDemoScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/NetworkListDemoScreen.kt
index c79c3b2..6007cb5 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/NetworkListDemoScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/NetworkListDemoScreen.kt
@@ -23,6 +23,9 @@ import com.joker.kit.feature.demo.viewmodel.NetworkListDemoViewModel
/**
* Network List Demo 路由
+ *
+ * @param viewModel Hilt 注入的 NetworkListDemoViewModel
+ * @author Joker.X
*/
@Composable
internal fun NetworkListDemoRoute(
@@ -62,6 +65,7 @@ internal fun NetworkListDemoRoute(
* @param shouldTriggerLoadMore 是否触发加载更多
* @param onBackClick 返回回调
* @param onRetry 重试回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -105,6 +109,7 @@ internal fun NetworkListDemoScreen(
* @param onRefresh 刷新回调
* @param onLoadMore 加载更多回调
* @param shouldTriggerLoadMore 是否触发加载更多
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -131,6 +136,9 @@ private fun NetworkListDemoContent(
/**
* 简单展示商品信息的列表项
+ *
+ * @param goods 商品实体
+ * @author Joker.X
*/
@Composable
private fun GoodsListItem(goods: Goods) {
@@ -146,6 +154,8 @@ private fun GoodsListItem(goods: Goods) {
/**
* Network List Demo 界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -161,6 +171,8 @@ private fun NetworkListDemoPreview() {
/**
* Network List Demo 界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -176,6 +188,9 @@ private fun NetworkListDemoPreviewDark() {
/**
* 预览用商品列表数据
+ *
+ * @return 商品预览数据列表
+ * @author Joker.X
*/
private fun previewGoodsList() = listOf(
Goods(id = 1, title = "小米手机 14", subTitle = "直屏旗舰", price = 3999, sold = 5000),
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/NetworkRequestScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/NetworkRequestScreen.kt
index f5bf85e..f9aff39 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/NetworkRequestScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/NetworkRequestScreen.kt
@@ -24,6 +24,9 @@ import com.joker.kit.feature.demo.viewmodel.NetworkRequestViewModel
/**
* 网络请求示例路由
+ *
+ * @param viewModel Hilt 注入的 NetworkRequestViewModel
+ * @author Joker.X
*/
@Composable
internal fun NetworkRequestRoute(
@@ -45,6 +48,7 @@ internal fun NetworkRequestRoute(
* @param goods 商品信息
* @param onBackClick 返回按钮回调
* @param onRequestClick 请求按钮回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -69,6 +73,7 @@ internal fun NetworkRequestScreen(
*
* @param goods 商品信息
* @param onRequestClick 请求按钮回调
+ * @author Joker.X
*/
@Composable
private fun NetworkRequestContent(
@@ -99,6 +104,7 @@ private fun NetworkRequestContent(
* 网络请求结果卡片视图
*
* @param goods 商品信息
+ * @author Joker.X
*/
@Composable
private fun CardResult(goods: Goods) {
@@ -116,6 +122,9 @@ private fun CardResult(goods: Goods) {
/**
* 模拟商品信息
+ *
+ * @return 示例商品
+ * @author Joker.X
*/
private fun mockGoods() = Goods(
id = 1,
@@ -128,6 +137,8 @@ private fun mockGoods() = Goods(
/**
* 网络请求界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -141,6 +152,8 @@ private fun NetworkRequestPreview() {
/**
* 网络请求界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -150,4 +163,4 @@ private fun NetworkRequestPreviewDark() {
goods = mockGoods(),
)
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/joker/kit/feature/demo/view/StateManagementScreen.kt b/app/src/main/java/com/joker/kit/feature/demo/view/StateManagementScreen.kt
index d7e6334..d3fe415 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/view/StateManagementScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/view/StateManagementScreen.kt
@@ -37,6 +37,7 @@ import com.joker.kit.feature.demo.viewmodel.StateManagementViewModel
* 状态管理示例路由
*
* @param viewModel Hilt 注入的 StateManagementViewModel
+ * @author Joker.X
*/
@Composable
internal fun StateManagementRoute(
@@ -62,6 +63,7 @@ internal fun StateManagementRoute(
* @param onDecrease -1 回调
* @param onReset 重置回调
* @param onBackClick 返回按钮回调
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -92,6 +94,7 @@ internal fun StateManagementScreen(
* @param onIncrease 递增回调
* @param onDecrease 递减回调
* @param onReset 重置回调
+ * @author Joker.X
*/
@Composable
private fun StateManagementContent(
@@ -116,6 +119,11 @@ private fun StateManagementContent(
}
}
+/**
+ * 状态管理介绍卡片
+ *
+ * @author Joker.X
+ */
@Composable
private fun IntroCard() {
Card(
@@ -147,6 +155,7 @@ private fun IntroCard() {
* @param onIncrease 递增回调
* @param onDecrease 递减回调
* @param onReset 重置回调
+ * @author Joker.X
*/
@Composable
private fun CounterCard(
@@ -203,6 +212,8 @@ private fun CounterCard(
/**
* 状态管理界面浅色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -214,6 +225,8 @@ private fun StateManagementPreview() {
/**
* 状态管理界面深色主题预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/DatabaseViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/DatabaseViewModel.kt
index 75b571e..a1f82ee 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/DatabaseViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/DatabaseViewModel.kt
@@ -21,6 +21,7 @@ import javax.inject.Inject
* @param navigator 导航管理器
* @param userState 用户状态管理
* @param demoRepository Demo 仓库,封装 DemoDataSource 的增删改查
+ * @author Joker.X
*/
@HiltViewModel
class DatabaseViewModel @Inject constructor(
@@ -40,6 +41,9 @@ class DatabaseViewModel @Inject constructor(
/**
* Demo 表数据流
* UI 侧直接 collectAsState() 获取最新列表
+ *
+ * @return Demo 列表状态流
+ * @author Joker.X
*/
val items: StateFlow> = demoRepository
.observeItems()
@@ -53,6 +57,7 @@ class DatabaseViewModel @Inject constructor(
* 更新标题输入
*
* @param value 文本框中的标题
+ * @author Joker.X
*/
fun onTitleChange(value: String) {
_title.value = value
@@ -62,6 +67,7 @@ class DatabaseViewModel @Inject constructor(
* 更新描述输入
*
* @param value 文本框中的描述
+ * @author Joker.X
*/
fun onDescriptionChange(value: String) {
_description.value = value
@@ -69,6 +75,8 @@ class DatabaseViewModel @Inject constructor(
/**
* 新增一条记录(仅当标题非空)
+ *
+ * @author Joker.X
*/
fun addItem() {
val title = _title.value.trim()
@@ -88,6 +96,7 @@ class DatabaseViewModel @Inject constructor(
* 删除指定记录
*
* @param id 记录主键
+ * @author Joker.X
*/
fun deleteItem(id: Long) {
viewModelScope.launch {
@@ -97,6 +106,8 @@ class DatabaseViewModel @Inject constructor(
/**
* 清空全部记录
+ *
+ * @author Joker.X
*/
fun clearAll() {
viewModelScope.launch {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/LocalStorageViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/LocalStorageViewModel.kt
index ee32941..f00ae52 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/LocalStorageViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/LocalStorageViewModel.kt
@@ -21,6 +21,7 @@ import kotlinx.coroutines.launch
* @param navigator 导航管理器
* @param userState 用户状态管理
* @param userInfoStoreRepository 用户信息本地存储仓库
+ * @author Joker.X
*/
@HiltViewModel
class LocalStorageViewModel @Inject constructor(
@@ -53,6 +54,7 @@ class LocalStorageViewModel @Inject constructor(
* 用户 id 文本更新
*
* @param value 输入的 id 字符串
+ * @author Joker.X
*/
fun onUserIdChange(value: String) {
_userId.value = value
@@ -62,6 +64,7 @@ class LocalStorageViewModel @Inject constructor(
* 用户昵称输入更新
*
* @param value 昵称文本
+ * @author Joker.X
*/
fun onNickNameChange(value: String) {
_nickName.value = value
@@ -71,6 +74,7 @@ class LocalStorageViewModel @Inject constructor(
* 头像链接输入更新
*
* @param value 头像 URL
+ * @author Joker.X
*/
fun onAvatarChange(value: String) {
_avatar.value = value
@@ -78,6 +82,8 @@ class LocalStorageViewModel @Inject constructor(
/**
* 保存用户信息到本地
+ *
+ * @author Joker.X
*/
fun saveUser() {
viewModelScope.launch {
@@ -95,6 +101,8 @@ class LocalStorageViewModel @Inject constructor(
/**
* 清除本地用户信息
+ *
+ * @author Joker.X
*/
fun clearUser() {
viewModelScope.launch {
@@ -108,6 +116,8 @@ class LocalStorageViewModel @Inject constructor(
/**
* 重新读取用户信息
+ *
+ * @author Joker.X
*/
fun loadUser() {
viewModelScope.launch {
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationResultViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationResultViewModel.kt
index ec40c20..8750c5b 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationResultViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationResultViewModel.kt
@@ -10,6 +10,10 @@ import javax.inject.Inject
/**
* 结果回传示例页 ViewModel
+ *
+ * @param navigator 导航管理器
+ * @param userState 用户状态
+ * @author Joker.X
*/
@HiltViewModel
class NavigationResultViewModel @Inject constructor(
@@ -19,6 +23,11 @@ class NavigationResultViewModel @Inject constructor(
navigator = navigator,
userState = userState
) {
+ /**
+ * 回传结果并返回上一页
+ *
+ * @author Joker.X
+ */
fun sendResultAndBack() {
popBackStackWithResult(
DemoResultKey,
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationWithArgsViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationWithArgsViewModel.kt
index c05c73f..f4ab0cc 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationWithArgsViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NavigationWithArgsViewModel.kt
@@ -11,6 +11,11 @@ import javax.inject.Inject
/**
* 带参跳转示例页 ViewModel
+ *
+ * @param navigator 导航管理器
+ * @param userState 用户状态
+ * @param savedStateHandle 路由参数存储
+ * @author Joker.X
*/
@HiltViewModel
class NavigationWithArgsViewModel @Inject constructor(
@@ -23,11 +28,17 @@ class NavigationWithArgsViewModel @Inject constructor(
) {
/**
* 路由参数
- * */
+ *
+ * @return 路由解析结果
+ * @author Joker.X
+ */
private val route = savedStateHandle.toRoute()
/**
* 商品ID
- * */
+ *
+ * @return 传递的商品 ID
+ * @author Joker.X
+ */
val goodsId: Long = route.goodsId
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkDemoViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkDemoViewModel.kt
index ee94496..b6a03be 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkDemoViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkDemoViewModel.kt
@@ -16,6 +16,7 @@ import javax.inject.Inject
* @param navigator 导航管理器
* @param userState 用户状态管理
* @param goodsRepository 商品数据仓库
+ * @author Joker.X
*/
@HiltViewModel
class NetworkDemoViewModel @Inject constructor(
@@ -30,8 +31,11 @@ class NetworkDemoViewModel @Inject constructor(
/**
* 重写请求API Flow,获取商品信息
+ *
+ * @return 商品信息响应流
+ * @author Joker.X
*/
override fun requestApiFlow(): Flow> {
return goodsRepository.getGoodsInfo("1")
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkListDemoViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkListDemoViewModel.kt
index 0a1353b..30a627a 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkListDemoViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkListDemoViewModel.kt
@@ -18,6 +18,7 @@ import javax.inject.Inject
* @param navigator 导航器
* @param userState 用户状态管理
* @param goodsRepository 商品数据仓库
+ * @author Joker.X
*/
@HiltViewModel
class NetworkListDemoViewModel @Inject constructor(
@@ -35,6 +36,9 @@ class NetworkListDemoViewModel @Inject constructor(
/**
* 重写请求API Flow,获取商品列表
+ *
+ * @return 商品分页数据流
+ * @author Joker.X
*/
override fun requestListData(): Flow>> {
return goodsRepository.getGoodsPage(
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkRequestViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkRequestViewModel.kt
index 4cffedc..237c17c 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkRequestViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/NetworkRequestViewModel.kt
@@ -16,6 +16,11 @@ import javax.inject.Inject
/**
* 网络请求示例页 ViewModel
+ *
+ * @param navigator 导航管理器
+ * @param userState 用户状态
+ * @param goodsRepository 商品仓库
+ * @author Joker.X
*/
@HiltViewModel
class NetworkRequestViewModel @Inject constructor(
@@ -29,12 +34,17 @@ class NetworkRequestViewModel @Inject constructor(
/**
* 商品信息
+ *
+ * @return 商品信息状态流
+ * @author Joker.X
*/
private val _goods = MutableStateFlow(null)
val goods: StateFlow = _goods.asStateFlow()
/**
* 发起商品信息请求,示例中固定传 id = 1
+ *
+ * @author Joker.X
*/
fun onRequestClick() {
ResultHandler.handleResultWithData(
diff --git a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/StateManagementViewModel.kt b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/StateManagementViewModel.kt
index 0e1fb79..52097c6 100644
--- a/app/src/main/java/com/joker/kit/feature/demo/viewmodel/StateManagementViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/demo/viewmodel/StateManagementViewModel.kt
@@ -10,6 +10,11 @@ import javax.inject.Inject
/**
* 状态管理示例页 ViewModel
+ *
+ * @param navigator 应用导航器
+ * @param userState 全局用户状态
+ * @param counterState 计数器状态
+ * @author Joker.X
*/
@HiltViewModel
class StateManagementViewModel @Inject constructor(
@@ -20,21 +25,30 @@ class StateManagementViewModel @Inject constructor(
/**
* 对外暴露的计数器 StateFlow
+ *
+ * @return 计数器状态流
+ * @author Joker.X
*/
val count: StateFlow = counterState.count
/**
* +1
+ *
+ * @author Joker.X
*/
fun increase() = counterState.increase()
/**
* -1
+ *
+ * @author Joker.X
*/
fun decrease() = counterState.decrease()
/**
* 重置为 0
+ *
+ * @author Joker.X
*/
fun reset() = counterState.reset()
}
diff --git a/app/src/main/java/com/joker/kit/feature/main/component/DemoCard.kt b/app/src/main/java/com/joker/kit/feature/main/component/DemoCard.kt
index a237e90..d693385 100644
--- a/app/src/main/java/com/joker/kit/feature/main/component/DemoCard.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/component/DemoCard.kt
@@ -18,6 +18,7 @@ import com.joker.kit.feature.main.model.DemoCardInfo
* @param info 卡片数据
* @param modifier 修饰符
* @param onClick 点击回调
+ * @author Joker.X
*/
@Composable
fun DemoCard(
@@ -51,7 +52,8 @@ private fun DemoCardPreview() {
DemoCard(
info = DemoCardInfo(
title = "示例组件",
- description = "预览展示 Demo 卡片默认样式。"
+ description = "预览展示 Demo 卡片默认样式。",
+ route = null
)
)
}
diff --git a/app/src/main/java/com/joker/kit/feature/main/data/DemoCardData.kt b/app/src/main/java/com/joker/kit/feature/main/data/DemoCardData.kt
index 1ec7aed..dd6ac50 100644
--- a/app/src/main/java/com/joker/kit/feature/main/data/DemoCardData.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/data/DemoCardData.kt
@@ -6,6 +6,8 @@ import com.joker.kit.navigation.routes.UserRoutes
/**
* Demo 卡片静态数据源
+ *
+ * @author Joker.X
*/
object DemoCardData {
@@ -59,4 +61,4 @@ object DemoCardData {
route = UserRoutes.Info
)
)
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/joker/kit/feature/main/model/DemoCardInfo.kt b/app/src/main/java/com/joker/kit/feature/main/model/DemoCardInfo.kt
index ba75d05..1735abb 100644
--- a/app/src/main/java/com/joker/kit/feature/main/model/DemoCardInfo.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/model/DemoCardInfo.kt
@@ -5,6 +5,8 @@ package com.joker.kit.feature.main.model
*
* @param title 标题
* @param description 描述内容
+ * @param route 跳转路由
+ * @author Joker.X
*/
data class DemoCardInfo(
val title: String,
diff --git a/app/src/main/java/com/joker/kit/feature/main/navigation/MainNavigation.kt b/app/src/main/java/com/joker/kit/feature/main/navigation/MainNavigation.kt
index 9846a3f..a171a0d 100644
--- a/app/src/main/java/com/joker/kit/feature/main/navigation/MainNavigation.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/navigation/MainNavigation.kt
@@ -11,6 +11,7 @@ import com.joker.kit.navigation.routes.MainRoutes
/**
* 注册主页面路由
*
+ * @param navController NavHostController
* @param sharedTransitionScope 共享转场作用域
* @author Joker.X
*/
diff --git a/app/src/main/java/com/joker/kit/feature/main/view/CoreDemoScreen.kt b/app/src/main/java/com/joker/kit/feature/main/view/CoreDemoScreen.kt
index 1b14be2..389b511 100644
--- a/app/src/main/java/com/joker/kit/feature/main/view/CoreDemoScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/view/CoreDemoScreen.kt
@@ -29,6 +29,7 @@ import com.joker.kit.feature.main.viewmodel.CoreDemoViewModel
* Core Demo 路由
*
* @param viewModel Core Demo ViewModel
+ * @author Joker.X
*/
@Composable
internal fun CoreDemoRoute(
@@ -49,6 +50,7 @@ internal fun CoreDemoRoute(
* @param cards Demo 卡片列表
* @param counter 全局计数器值,大于 0 时在列表顶部展示
* @param onCardClick 卡片点击回调
+ * @author Joker.X
*/
@Composable
internal fun CoreDemoScreen(
@@ -81,6 +83,7 @@ internal fun CoreDemoScreen(
* 主页计数器提示
*
* @param counter 当前计数器值
+ * @author Joker.X
*/
@Composable
private fun CounterBanner(counter: Int) {
@@ -94,6 +97,8 @@ private fun CounterBanner(counter: Int) {
/**
* Core Demo 浅色预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -107,6 +112,8 @@ private fun CoreDemoPreview() {
/**
* Core Demo 深色预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/main/view/MainScreen.kt b/app/src/main/java/com/joker/kit/feature/main/view/MainScreen.kt
index db5d3ae..94b24ab 100644
--- a/app/src/main/java/com/joker/kit/feature/main/view/MainScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/view/MainScreen.kt
@@ -74,6 +74,11 @@ internal fun MainScreen(
/**
* 主页面内容视图,包含底部导航和横向 Pager
+ *
+ * @param uiState UI 状态
+ * @param onTabSelected Tab 切换回调
+ * @param navController 导航控制器
+ * @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
@Composable
@@ -126,6 +131,11 @@ private fun MainScreenContent(
/**
* 自定义纯文字底部导航栏
+ *
+ * @param tabs 底部栏 Tab 列表
+ * @param currentTab 当前选中 Tab
+ * @param onTabSelected Tab 选择回调
+ * @author Joker.X
*/
@Composable
private fun MainBottomBar(
diff --git a/app/src/main/java/com/joker/kit/feature/main/view/NavigationDemoScreen.kt b/app/src/main/java/com/joker/kit/feature/main/view/NavigationDemoScreen.kt
index c4dfe7c..b5ee083 100644
--- a/app/src/main/java/com/joker/kit/feature/main/view/NavigationDemoScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/view/NavigationDemoScreen.kt
@@ -33,6 +33,8 @@ import com.joker.kit.navigation.results.DemoResultKey
* Navigation Demo 路由
*
* @param viewModel Navigation Demo ViewModel
+ * @param navController 用于监听结果的 NavController
+ * @author Joker.X
*/
@Composable
internal fun NavigationDemoRoute(
@@ -60,6 +62,9 @@ internal fun NavigationDemoRoute(
*
* @param cards Demo 卡片列表
* @param isLoggedIn 是否已登录,登录后展示提示
+ * @param demoResult 回传结果
+ * @param onCardClick 卡片点击回调
+ * @author Joker.X
*/
@Composable
internal fun NavigationDemoScreen(
@@ -96,7 +101,9 @@ internal fun NavigationDemoScreen(
/**
* 登录状态提示卡片
- * */
+ *
+ * @author Joker.X
+ */
@Composable
private fun LoginStatusBanner() {
Card(modifier = Modifier.fillMaxWidth()) {
@@ -107,7 +114,12 @@ private fun LoginStatusBanner() {
}
}
-/** 回传结果提示卡片 */
+/**
+ * 回传结果提示卡片
+ *
+ * @param result 回传结果
+ * @author Joker.X
+ */
@Composable
private fun DemoResultBanner(result: DemoResult) {
Card(modifier = Modifier.fillMaxWidth()) {
@@ -120,6 +132,8 @@ private fun DemoResultBanner(result: DemoResult) {
/**
* Navigation Demo 浅色预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
@@ -133,6 +147,8 @@ private fun NavigationDemoPreview() {
/**
* Navigation Demo 深色预览
+ *
+ * @author Joker.X
*/
@Preview(showBackground = true)
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/main/viewmodel/CoreDemoViewModel.kt b/app/src/main/java/com/joker/kit/feature/main/viewmodel/CoreDemoViewModel.kt
index 7ff10c3..6047abe 100644
--- a/app/src/main/java/com/joker/kit/feature/main/viewmodel/CoreDemoViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/viewmodel/CoreDemoViewModel.kt
@@ -14,6 +14,11 @@ import javax.inject.Inject
/**
* Core Demo ViewModel
+ *
+ * @param navigator 导航管理器
+ * @param userState 用户状态
+ * @param counterState 计数器状态
+ * @author Joker.X
*/
@HiltViewModel
class CoreDemoViewModel @Inject constructor(
@@ -28,9 +33,20 @@ class CoreDemoViewModel @Inject constructor(
private val _cards = MutableStateFlow(DemoCardData.coreCards)
val cards: StateFlow> = _cards.asStateFlow()
- /** 全局计数器值 */
+ /**
+ * 全局计数器值
+ *
+ * @return 计数器状态流
+ * @author Joker.X
+ */
val count: StateFlow = counterState.count
+ /**
+ * 处理卡片点击
+ *
+ * @param info 被点击的卡片信息
+ * @author Joker.X
+ */
fun onCardClick(info: DemoCardInfo) {
info.route?.let { navigate(it) }
}
diff --git a/app/src/main/java/com/joker/kit/feature/main/viewmodel/MainViewModel.kt b/app/src/main/java/com/joker/kit/feature/main/viewmodel/MainViewModel.kt
index a4c0a5f..20faa4d 100644
--- a/app/src/main/java/com/joker/kit/feature/main/viewmodel/MainViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/viewmodel/MainViewModel.kt
@@ -30,6 +30,9 @@ class MainViewModel @Inject constructor(
/**
* 切换底部导航 tab
+ *
+ * @param tab 目标 Tab
+ * @author Joker.X
*/
fun selectTab(tab: MainTab) {
if (tab == _uiState.value.currentTab) return
@@ -41,6 +44,7 @@ class MainViewModel @Inject constructor(
* Main 页面 UI 状态
*
* @param currentTab 当前底部栏 tab
+ * @author Joker.X
*/
data class MainUiState(
val currentTab: MainTab = MainTab.Core
@@ -48,6 +52,9 @@ data class MainUiState(
/**
* Main 页面底部栏 Tab
+ *
+ * @param title Tab 标题
+ * @author Joker.X
*/
enum class MainTab(val title: String) {
Core("Core"),
@@ -58,6 +65,13 @@ enum class MainTab(val title: String) {
companion object {
val allTabs: List = values().toList()
+ /**
+ * 根据索引获取 Tab
+ *
+ * @param index 底部栏索引
+ * @return 对应的 Tab,超出范围返回 Core
+ * @author Joker.X
+ */
fun fromIndex(index: Int): MainTab {
return allTabs.getOrElse(index) { Core }
}
diff --git a/app/src/main/java/com/joker/kit/feature/main/viewmodel/NavigationDemoViewModel.kt b/app/src/main/java/com/joker/kit/feature/main/viewmodel/NavigationDemoViewModel.kt
index 0390428..fdf4e44 100644
--- a/app/src/main/java/com/joker/kit/feature/main/viewmodel/NavigationDemoViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/main/viewmodel/NavigationDemoViewModel.kt
@@ -14,6 +14,10 @@ import javax.inject.Inject
/**
* Navigation Demo ViewModel
+ *
+ * @param navigator 导航管理器
+ * @param userState 用户状态
+ * @author Joker.X
*/
@HiltViewModel
class NavigationDemoViewModel @Inject constructor(
@@ -27,16 +31,33 @@ class NavigationDemoViewModel @Inject constructor(
private val _cards = MutableStateFlow(DemoCardData.navigationCards)
val cards: StateFlow> = _cards.asStateFlow()
- /** 全局登录状态 */
+ /**
+ * 全局登录状态
+ *
+ * @return 登录状态流
+ * @author Joker.X
+ */
val isLoggedIn: StateFlow = userState.isLoggedIn
private val _demoResult = MutableStateFlow(null)
val demoResult: StateFlow = _demoResult.asStateFlow()
+ /**
+ * 处理卡片点击
+ *
+ * @param info 卡片信息
+ * @author Joker.X
+ */
fun onCardClick(info: DemoCardInfo) {
info.route?.let { navigate(it) }
}
+ /**
+ * 处理回传结果
+ *
+ * @param result 回传结果
+ * @author Joker.X
+ */
fun onResultReceived(result: DemoResult) {
_demoResult.value = result
}
diff --git a/app/src/main/java/com/joker/kit/feature/user/view/UserInfoScreen.kt b/app/src/main/java/com/joker/kit/feature/user/view/UserInfoScreen.kt
index 37c3401..151c07a 100644
--- a/app/src/main/java/com/joker/kit/feature/user/view/UserInfoScreen.kt
+++ b/app/src/main/java/com/joker/kit/feature/user/view/UserInfoScreen.kt
@@ -37,6 +37,7 @@ internal fun UserInfoRoute(
* 用户信息页面
*
* @param onBackClick 返回按钮回调
+ * @param onLogoutClick 退出登录回调
* @author Joker.X
*/
@OptIn(ExperimentalMaterial3Api::class)
@@ -60,6 +61,7 @@ internal fun UserInfoScreen(
* 用户信息内容
*
* @param modifier 修饰符
+ * @param onLogoutClick 退出登录回调
* @author Joker.X
*/
@Composable
diff --git a/app/src/main/java/com/joker/kit/feature/user/viewmodel/UserInfoViewModel.kt b/app/src/main/java/com/joker/kit/feature/user/viewmodel/UserInfoViewModel.kt
index f7ab1d1..a13ce87 100644
--- a/app/src/main/java/com/joker/kit/feature/user/viewmodel/UserInfoViewModel.kt
+++ b/app/src/main/java/com/joker/kit/feature/user/viewmodel/UserInfoViewModel.kt
@@ -27,6 +27,8 @@ class UserInfoViewModel @Inject constructor(
/**
* 一键退出登录(本地清空)
+ *
+ * @author Joker.X
*/
fun logout() {
viewModelScope.launch {
diff --git a/app/src/main/java/com/joker/kit/navigation/extension/NavigationResultExt.kt b/app/src/main/java/com/joker/kit/navigation/extension/NavigationResultExt.kt
index 27af1e2..f663497 100644
--- a/app/src/main/java/com/joker/kit/navigation/extension/NavigationResultExt.kt
+++ b/app/src/main/java/com/joker/kit/navigation/extension/NavigationResultExt.kt
@@ -9,6 +9,11 @@ import com.joker.kit.navigation.NavigationResultKey
/**
* 监听返回结果扩展
+ *
+ * @param key 结果键,定义序列化/反序列化规则
+ * @param onResult 结果回调
+ * @param T 结果数据类型
+ * @author Joker.X
*/
@Composable
fun NavController.observeResult(
diff --git a/app/src/main/java/com/joker/kit/navigation/results/DemoResultKey.kt b/app/src/main/java/com/joker/kit/navigation/results/DemoResultKey.kt
index c0d19be..b64a7cc 100644
--- a/app/src/main/java/com/joker/kit/navigation/results/DemoResultKey.kt
+++ b/app/src/main/java/com/joker/kit/navigation/results/DemoResultKey.kt
@@ -6,12 +6,36 @@ import kotlinx.serialization.json.Json
/**
* Demo 结果回传示例:返回 DemoResult 数据类
+ *
+ * @author Joker.X
*/
object DemoResultKey : NavigationResultKey {
+ /**
+ * 序列化结果
+ *
+ * @param value 待序列化的结果对象
+ * @return 序列化后的字符串
+ * @author Joker.X
+ */
override fun serialize(value: DemoResult): Any = Json.encodeToString(value)
+
+ /**
+ * 反序列化结果
+ *
+ * @param raw 原始保存的数据
+ * @return 解析后的结果对象
+ * @author Joker.X
+ */
override fun deserialize(raw: Any): DemoResult = Json.decodeFromString(raw as String)
}
+/**
+ * Demo 结果数据
+ *
+ * @param id 结果标识
+ * @param message 结果信息
+ * @author Joker.X
+ */
@Serializable
data class DemoResult(
val id: Long,
diff --git a/app/src/main/res/values-night-v31/themes.xml b/app/src/main/res/values-night-v31/themes.xml
index 5b86c9f..39e7b1c 100755
--- a/app/src/main/res/values-night-v31/themes.xml
+++ b/app/src/main/res/values-night-v31/themes.xml
@@ -1,7 +1,7 @@
-