Skip to content
jenly1314Public

About

🏰 MVVMFrame 是一个基于Google官方推出的JetPack构建的快速开发框架。从此构建一个MVVM模式的项目变得快捷简单。

Topics

Resources

Stars

416 stars

Watchers

10 watching

Forks

Repository files navigation

MVVMFrame

Image

MavenCentral JitPack CI Download API License

MVVMFrame for Android 是一个基于Google官方推出的Architecture Components dependencies(现在叫JetPack)构建的快速开发框架。有了 MVVMFrame 的加持,从此构建一个 MVVM 模式的项目变得快捷简单。

架构

Image

引入

Gradle:

  1. 在Project的 build.gradle 或 setting.gradle 中添加远程仓库

    repositories {
        //...
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
  2. 在Module的 build.gradle 中添加依赖项

    implementation 'com.github.jenly1314:mvvmframe:3.4.0'

Gradle Plugin(v3.0.0新增)

  1. 首先,将 MVVMFrame 插件添加到项目根级 build.gradle 文件中:

    plugins {
        //...
        id 'com.github.jenly1314.mvvmframe' version '3.4.0' apply false
    }
  2. 接下来,在 app/build.gradle 文件中,添加 MVVMFrame 插件:

    plugins {
        //...
        id 'com.github.jenly1314.mvvmframe'
    }
    // 可选:如果有需要可以自定义mvvmFrame插件配置
    mvvmFrame {
        //...
        // 是否启用依赖:androidx.room:room-runtime
        enabledRoomRuntime true
        // 是否启用依赖:androidx.room:room-compiler
        enabledRoomCompiler true
    }

MVVMFrame 插件的主要作用是简化 Hilt 和 Room 相关依赖中的 kapt/ksp 配置。如果你的项目希望完全自主管理 Hilt 和 Room 的编译器依赖,可以忽略此插件。

使用

版本特别说明

  • 3.x版本统一改为使用kotlin并进行了重构;之前2.x版本内部使用的LiveData相关代码已全部移除,3.x版本已全部改用kotlin独有的Flow进行实现。

  • 3.x相比较于2.x版本更为精简,可定制性更高。(如果需要在Compose中进行使用,只需加上Compose的UI相关依赖,稍微封装下即可)

建议在新项目中使用;如果你之前使用的是2.x旧版本,请谨慎升级。

如果你使用 v2.x 版本的话,请直接 查看2.x分支版本


从分割线此处开始,以下全部为3.x版本相关说明

集成步骤说明(完整示例可直接查看app)

Step.1 启用 ViewDataBinding ,在你项目中的 build.gradle 中添加配置:

android {
    //...
    buildFeatures {
        dataBinding true
    }
}

Step.2 使用JDK17编译,在你项目中的 build.gradle 中添加配置:

android {
    //...
    compileOptions {
        targetCompatibility JavaVersion.VERSION_17
        sourceCompatibility JavaVersion.VERSION_17
    }
}

Step.3 自定义全局配置(继承MVVMFrame中的FrameConfigModule )(提示:如果你没有自定义配置的需求,可以直接忽略此步骤)

/**
 * 全局配置
 */
class AppConfigModule : FrameConfigModule() {
    override fun applyOptions(context: Context, builder: ConfigModule.Builder) {
        // 通过第一种方式初始化BaseUrl
        builder.baseUrl(Constants.BASE_URL) // TODO 配置Retrofit中的baseUrl

        builder.retrofitOptions(object : RetrofitOptions {
            override fun applyOptions(builder: Retrofit.Builder) {
                // TODO 配置Retrofit
            }
        })
            .okHttpClientOptions(object : OkHttpClientOptions {
                override fun applyOptions(builder: OkHttpClient.Builder) {
                    // TODO 配置OkHttpClient
                }
            })
            .gsonOptions(object : GsonOptions {
                override fun applyOptions(builder: GsonBuilder) {
                    // TODO 配置Gson
                }
            })
            .roomDatabaseOptions(object : RoomDatabaseOptions {
                override fun applyOptions(builder: RoomDatabase.Builder<out RoomDatabase>) {
                    // TODO 配置RoomDatabase
                }
            })
            .configOptions(object : AppliesOptions.ConfigOptions {
                override fun applyOptions(builder: Config.Builder) {
                    // TODO 配置Config
                    builder.httpLoggingLevel(
                        if (BuildConfig.DEBUG) {
                            HttpLoggingInterceptor.Level.BODY
                        } else {
                            HttpLoggingInterceptor.Level.NONE
                        }
                    )
                }
            })
    }
}

然后在你项目中的 AndroidManifest.xml 中通过配置meta-data来自定义全局配置(提示:如果你没有自定义配置的需求,可以直接忽略此步骤)

<!-- MVVMFrame 全局配置 -->
<meta-data android:name="com.king.mvvmframe.config.AppConfigModule"
           android:value="FrameConfigModule"/>

此处的com.king.mvvmframe.config.AppConfigModule 替换为你自定义的全局配置类

Step.4 配置Application

 @HiltAndroidApp
 class YourApplication : BaseApplication() {
    //...

    override fun onCreate() {
        super.onCreate()
        // 如果你没有使用FrameConfigModule中的第一中方式初始化BaseUrl,也可以通过此处的第二种方式来设置BaseUrl(二选其一即可)
//        RetrofitHelper.getInstance().setBaseUrl(baseUrl)
    }
 }

如果由于某种原因,导致你不能继承BaseApplication;你也可以在你自定义的Application的onCreate函 数中通过调用BaseApplication.initAppConfig来进行初始化。

其他

关于使用 Hilt

Hilt 是JetPack中新增的一个依赖注入库,其基于 Dagger2 研发(后面统称为Dagger),但它不同于Dagger。对于Android开发者来说,Hilt可以说专门为Android 打造。

之前使用的 Dagger for Android 虽然也是针对于Android打造,也能通过 @ContributesAndroidInjector 来通过生成简化一部分样板代码,但是感觉还不够彻底。因为 Component 层相关的桥接还是要自己写。Hilt 的诞生改善了这些问题。

使用 Hilt 之后,依赖注入变得更简单。

Hilt 目前支持以下 Android 类:

  • Application(通过使用 @HiltAndroidApp)
  • ViewModel(通过使用 @HiltViewModel)
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver

Application 示例 (这里我们使用BaseApplication)

@HiltAndroidApp
class YourApplication : BaseApplication() {
    //...
}

ViewModel 示例 (这里我们使用BaseViewModel)

@HiltViewModel
class YourViewModel : BaseViewModel() {
    //...
}

其他的入口点,都是用 @AndroidEntryPoint 注解来声明,示例如下

Activity 示例 (这里我们使用BaseActivity)

@AndroidEntryPoint
class YourActivity: BaseActivity() {
    //...
}

Fragment 示例 (这里我们使用BaseFragment)

@AndroidEntryPoint
class YourFragment: BaseFragment() {
    //...
}

其他入口点都基本类似,不再一一列举了。更多有关 Hilt 的使用说明,可以查看官方的Hilt使用指南。

关于设置 BaseUrl

目前通过设置 BaseUrl 的入口主要有两种:

1.一种是通过在 Manifest 中配置 meta-data 的来自定义 FrameConfigModule,在里面 通过 {@link ConfigModule.Builder#baseUrl(String)}来配置 BaseUrl。(一次设置,全局配置)

2.一种就是通过RetrofitHelper {@link RetrofitHelper#setBaseUrl(String)} 或 {@link RetrofitHelper#setBaseUrl(HttpUrl)} 来配置 BaseUrl。(可多次设置,动态全局配置,有前提条件)

以上两种配置 BaseUrl 的方式都可以达到目的。但是你可以根据不同的场景选择不同的配置方式。

主要场景与选择如下:

一般场景:对于只使用单个不变的 BaseUrl的

场景1:如果本库的默认已满足你的需求,无需额外自定义配置的。
     选择:建议你直接使用 {@link RetrofitHelper#setBaseUrl(String)} 或 {@link RetrofitHelper#setBaseUrl(HttpUrl)} 来初始化 BaseUrl,切记在框架配置初始化 BaseUrl之前,建议在你自定义的 {@link Application#onCreate()}中初始化。
场景2:如果本库的默认配置不满足你的需求,你需要自定义一些配置的。(比如需要使用 RxJava相关)
     选择:建议你在自定义配置中通过 {@link ConfigModule.Builder#baseUrl(String)} 来初始化 BaseUrl。

进阶场景:对于只使用单个 BaseUrl 但是,BaseUrl中途会变动的。

场景3:和一般场景一样,也能分两种,所以选择也和一般场景也可以是一样的。
     选择:两种选择都行,但当 BaseUrl需要中途变动时,还需将 {@link RetrofitHelper#setDynamicDomain(boolean)} 设置为 {@code true} 才能支持动态改变 BaseUrl。

特殊场景:对于支持多个 BaseUrl 且支持动态可变的。

   选择:这个场景的选择,主要涉及到另外的方法,请查看 {@link RetrofitHelper#putDomain(String, String)} 和 {@link RetrofitHelper#putDomain(String, HttpUrl)}相关详情

更多使用详情,请查看app中的源码使用示例或直接查看 API帮助文档

混淆

目前 MVVFrame 所有依赖混淆规则可参见:ProGuard rules

相关推荐

  • AppTemplate 一款基于 MVVMFrame 构建的App模板
  • MVVMFrameComponent 一款基于 MVVMFrame 构建的组件化方案
  • EasyChat 一款即时通讯APP
  • KingWeather 一款天气预报APP
  • EasyNote 一款遵循 Clean Architecture 架构分层, 使用 Jetpack Compose 实现的笔记App
  • RetrofitHelper 一个支持动态改变BaseUrl,动态配置超时时长的Retrofit帮助类。
  • AppUpdater 一个专注于App更新,一键傻瓜式集成App版本升级的轻量开源库。
  • LogX 一个轻量而强大的日志框架;好用不解释。
  • KVCache 一个便于统一管理的键值缓存库;支持无缝切换缓存实现。
  • AndroidKTX 一个简化 Android 开发的 Kotlin 工具类集合。
  • AndroidUtil 一个整理了Android常用工具类集合,平时在开发的过程中可能会经常用到。

版本日志

v3.4.0:2026-9-18

  • 更新compileSdk至36
  • 更新gradle至v9.3.1
  • 更新kotlin至v2.2.21
  • 更新appcompat至v1.8.0
  • 更新core-ktx至v1.17.0
  • 更新fragment-ktx至v1.9.0
  • 更新lifecycle-ktx至v2.10.0
  • 更新hilt至v2.60.1
  • 更新room至v2.8.5
  • 更新okhttp至v5.4.0
  • 更新gson至v2.14.0
  • 更新ksp至v2.3.2
  • 移除kapt
  • 源码目录调整(src/main/java -> src/main/kotlin)
  • 优化细节

footer

About

🏰 MVVMFrame 是一个基于Google官方推出的JetPack构建的快速开发框架。从此构建一个MVVM模式的项目变得快捷简单。

Topics

Resources

Stars

416 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages