[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7591":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":15,"starSnapshotCount":15,"syncStatus":18,"lastSyncTime":27,"discoverSource":28},7591,"Android-Compose-MVVM-App","darryrzhong\u002FAndroid-Compose-MVVM-App","darryrzhong","基于 Jetpack Compose 的仿开眼短视频 Android 开源项目 -开眼短视频(OpenEyes)","",null,"Kotlin",1845,468,26,0,4,17,2,21.01,false,"master",true,[],"2026-06-12 02:01:41","> 一款模仿 Eyepetizer | 开眼视频的开源 Android App\n\n基于 **MVVM + 组件化** 架构，采用 **Jetpack Compose + Hilt + Navigation Compose** 全面重构，UI 层完全使用 Compose 实现。\n\n## 效果图\n\n| ![app_02.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-9380bb706c59e3af.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) | ![app_03.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-0fd473371888d8ac.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) | ![app_04.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-2e2421bce1e93e26.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) |\n| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |\n| ![app_05.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-5d56b2b27f5e942e.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) | ![app_06.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-de207f28f6b3bdf7.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) | ![app_07.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-7e5261c0c5a6f7cd.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) |\n| ![app_08.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-2b5e338fb31a0c25.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) | ![app_09.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-6950f3f3ed412191.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) | ![app_10.png](https:\u002F\u002Fupload-images.jianshu.io\u002Fupload_images\u002F5549640-58b719bb47a3dbfc.png?imageMogr2\u002Fauto-orient\u002Fstrip%7CimageView2\u002F2\u002Fw\u002F260) |\n\n\n## 项目结构\n\n采用组件化开发，`gradle.properties` 中的 `isBuildModule` 控制构建模式：\n\n- `isBuildModule=false`：所有模块作为 library 集成到 app（正常开发）\n- `isBuildModule=true`：某个模块作为独立 App 运行（单模块调试）\n\n```\napp（宿主 Application，组装 AppNavHost）\n  └── module-main（底部导航 + 主框架）\n       ├── module-home（首页：发现 \u002F 日报 \u002F 推荐）\n       ├── module-community（社区：推荐 \u002F 关注）\n       └── module-player（视频详情页）\n\nlibrary-common（公共配置 + AppRoutes 路由常量）\nlibrary-base（BaseApplication + BaseViewModel + 通用 Compose 组件）\nlibrary-network（Retrofit + OkHttp + Hilt 网络层）\n```\n\n## 技术栈\n\n| 类别 | 技术 | 版本 |\n|------|------|------|\n| 语言 | Kotlin | 2.0.21 |\n| UI | Jetpack Compose + Material3 | BOM 2025.02.00 |\n| 导航 | Navigation Compose | 2.8.5 |\n| 依赖注入 | Hilt | 2.52 |\n| 异步 | Kotlin Coroutines | 1.9.0 |\n| 网络 | Retrofit2 + OkHttp4 | 2.11.0 \u002F 4.12.0 |\n| 图片加载 | Coil | 2.7.0 |\n| 视频播放 | GSYVideoPlayer | 12.0.0 |\n| 本地存储 | MMKV | 2.4.0 |\n| compileSdk \u002F minSdk | - | 35 \u002F 24 |\n\n## 架构设计\n\n**UI 状态（UiState + sealed class）**\n\n每个 Screen 对应一个 `sealed class UiState`（`Loading \u002F Success \u002F Error`），ViewModel 持有 `MutableStateFlow\u003CXxxUiState>`，Screen 通过 `collectAsState()` 消费。\n\n**网络层（NetworkResult + safeApiCall）**\n\n`library-network` 提供 `NetworkResult\u003CT>（Success \u002F Error）` 密封类和 `safeApiCall {}` 挂起函数，统一处理 HttpException \u002F IOException。\n\n**导航（Navigation Compose）**\n\n跨模块导航路由常量统一定义在 `library-common` 的 `AppRoutes`，各业务模块暴露 `NavGraphBuilder.xxxNavGraph()` 扩展函数，由 `app` 模块的 `AppNavHost` 统一组装。\n\n**依赖注入（Hilt）**\n\n`ModulePlugin` 统一为所有模块添加 Hilt 依赖，Screen 通过 `hiltViewModel()` 获取 ViewModel。\n\n## 构建\n\n```bash\n# Debug 构建\n.\u002Fgradlew assembleDebug\n\n# Release 构建\n.\u002Fgradlew assembleRelease\n\n# 清理\n.\u002Fgradlew clean\n```\n\n## 项目 API\n\n> 声明：项目中所有 API 接口均抓取自开眼 App，所有版权归属开眼 App 所有，仅供学习借鉴使用，请勿用于商业用途，若有侵权，请联系作者删除。\n\nBase URL：`http:\u002F\u002Fbaobab.kaiyanapp.com\u002Fapi\u002F`\n\n### 首页\n\n1. 发现更多\n   - `GET \u002Fv7\u002Findex\u002Ftab\u002Fdiscovery`\n\n2. 每日推荐\n   - `GET \u002Fv5\u002Findex\u002Ftab\u002FallRec`\n\n3. 日报精选\n   - `GET \u002Fv5\u002Findex\u002Ftab\u002Ffeed`\n\n### 社区\n\n1. 推荐\n   - `GET \u002Fv7\u002Fcommunity\u002Ftab\u002Frec`\n\n2. 关注\n   - `GET \u002Fv6\u002Fcommunity\u002Ftab\u002Ffollow`\n\n### 视频详情页\n\n1. 相关推荐\n   - `GET \u002Fv4\u002Fvideo\u002Frelated?id={videoId}`\n\n2. 评论\n   - `GET \u002Fv2\u002Freplies\u002Fvideo?videoId={videoId}`\n\n## 项目地址\n\n**[Android-MvvmComponent-App](https:\u002F\u002Fgithub.com\u002Fdarryrzhong\u002FAndroid-MvvmComponent-App)**\n\n欢迎关注作者 [darryrzhong](https:\u002F\u002Fdarryrzhong.github.io\u002F)，更多干货等你来拿。\n","该项目是一款基于Jetpack Compose的仿开眼短视频Android开源应用，旨在提供一个高质量的视频浏览体验。它采用了MVVM架构和组件化设计模式，利用了Jetpack Compose、Hilt依赖注入以及Navigation Compose等现代Android开发技术栈来构建UI界面与逻辑层。项目完全使用Kotlin语言编写，并集成了Retrofit+OkHttp网络请求库、Coil图片加载库及GSYVideoPlayer视频播放器等工具，确保了良好的性能与用户体验。适合于希望学习或参考最新Android UI框架实践、模块化开发策略以及如何在实际项目中运用MVVM架构的开发者们。此外，对于想要快速搭建功能齐全且美观的视频类应用的团队来说，也是一个很好的起点。","2026-06-11 03:13:12","top_language"]