KOtlin Coroutine with MVVM



我对kotlin非常陌生,这是我的第一个kotlin MVVM应用程序,实际上应用程序没有运行,请帮我找出我在这里犯的错误。

登录视图模型:

class LoginViewModel (private val loginRepository: LoginRepository) : ViewModel() {
suspend fun login(email: String, password: String) {
viewModelScope.launch {
try {
val loginModel = LoginModel(email, password)
val response = loginRepository.getUsers(loginModel)
Resource.success(data = response)
} catch (ex: Exception) {
Resource.error(data = null, message = ex.message ?: "Error occured!")
}
}
}
}

API助手:

class ApiHelper (private val api: Api) {
suspend fun makeLogin() = api.makeLogin()
}

ViewModelFactory:

class ViewModelFactory (private val apiHelper: ApiHelper) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(LoginViewModel::class.java)) {
return LoginViewModel(LoginRepository(apiHelper)) as T
}
throw IllegalArgumentException("Unknown class name")
}

型号类别:

data class LoginResponse(
val token : String
)

型号等级

data class LoginError(
val error: String
)

存储库:

class LoginRepository(private val apiHelper: ApiHelper) {
suspend fun getUsers(loginModel: LoginModel) = apiHelper.makeLogin()
}

API:

interface Api {
@POST("login")
suspend fun makeLogin(): Response<LoginResponse>

帮帮我,因为我是一个初学者,我参考了很多教程,但我不明白。

我认为您的视图模型没有初始化。使用更新的库初始化活动和片段中的视图模型

implementation "androidx.lifecycle:lifecycle-extension:2.2.0" //for Activty
implementation 'androidx.fragment:fragment-ktx:1.1.0' // for fragment

在下面这样的活动中初始化了loginViewmodel。

val loginViewmodel: LoginViewModel by viewModels()

在下面这样的片段中获取相同loginviewmodel的实例

val loginViewmodel: LoginViewModel by activityViewModels()

在viewmodel中创建方法,以在下面获得类似这样的LoginDepository实例

fun setLoginRepository(loginRepository: LoginRepository){
this.loginRepository = loginRepository
}

在您的案例中,无需将存储库对象传递到视图模型的构造函数中,也无需在活动或视图模型中初始化repo对象。代码的其余部分看起来不错。这可能对你有帮助。如果你需要任何其他帮助,请告诉我。

最新更新