MVI的模板代码分享

各种模式对比

从 mvc 到 mvp,mvvm 再到 mvi,目的是让代码结构更清晰,更容易维护。

模式优点缺点
mvc简单,快速 ,适合小项目controller会越来越臃肿,view和model耦合
mvpview只依赖于presenter层,解耦view和modelpresenter通过接口回调给view,接口会越来越多,有内存泄漏风险
mvvmviewModel和view数据双向绑定,不需要过多接口,隐藏回调细节,减少内存泄漏风险实现起来复杂
mvi将数据封装成userIntent和uistate,实现数据单向流动,结构更加简单实现起来复杂,userIntent和uistate容易膨胀

其中这篇文章有非常详细的介绍:
https://blog.csdn.net/lengjiye/article/details/129736951

mvi 的模板代码

userIntent
将 view 的一些操作封装各种 Intent

interface IUserIntent {
}

例如,以下是登录界面的各种意图


sealed class LoginUserIntent : IUserIntent {

    data class PhoneNumLogin(val phone: String) : LoginUserIntent()

    data class facebookLogin(val accountNum: String) : LoginUserIntent()

    data class WechatLogin(val wechatAccount: String) : LoginUserIntent()

}

uistate
我们在进行一些逻辑运算之后,会获取到各种数据,然后将这些数据封装成 uistate

interface IUiState {
}

例如,登录界面的各种状态

sealed class LoginUiState : IUiState {

    data class LoginSuccessState(val type: String, val userId: String?) : LoginUiState()

    data class LoginFailedState(val type: String,val errCode: Int, val msg: String?) : LoginUiState()

}

模板

abstract class BaseViewModel<I: IUserIntent,S: IUiState> : ViewModel() {

    private val _userIntentFlow: MutableStateFlow<I> = MutableStateFlow(mNoneValueIntent)

    protected val mUiState: MutableLiveData<S> = MutableLiveData()

    abstract val mNoneValueIntent: I

    init {
        /**
         * 处理用户意图
         */
        _userIntentFlow.onEach { userIntent ->
            println("userIntentFlow onEach:$userIntent")
            userIntent?.let { handleIntent(it) }
        }.launchIn(viewModelScope)
    }

    abstract fun handleIntent(userIntent: I)


    /**
     * 驱动UI更新
     */
    fun obtainUiState(): MutableLiveData<S> {
        return mUiState
    }

    /**
     * 延迟10ms重置状态,防止连续发送相同状态stateFlow没处理
     */
    suspend fun sendUserIntent(userIntent: I) {
        _userIntentFlow.tryEmit(userIntent)
        delay(10)
        _userIntentFlow.tryEmit(mNoneValueIntent)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值