首页 > 解决方案 > 使用 dagger2 未在 ViewModel 中注入改造服务类

问题描述

我正在尝试在 ViewModel 中注入改造创建的 API 服务,如下所示:

class LoginViewModel @Inject constructor() : ViewModel(){
    @Inject
    lateinit var service: LoginService

    var username : String=""
    var password : String=""

    fun signInClicked(){
        if (!Patterns.EMAIL_ADDRESS.matcher(username).matches()){
            return
        }else if(password.isEmpty()){
            return;
        }
       val call = service?.getCurrentWeatherData("35","139","2e65127e909e178d0af311a81f39948c")
        call?.enqueue(object :Callback<Model.WeatherResponse>{
            override fun onFailure(call: Call<Model.WeatherResponse>, t: Throwable) {
                Log.i("RESPONSE","FAILURE")
            }

            override fun onResponse(
                call: Call<Model.WeatherResponse>,
                response: Response<Model.WeatherResponse>
            ) {
                Log.i("RESPONSE","SUCCESS")
            }

        })
    }
}

这是我的匕首模块类

    @Module
class NetworkingModule {

    @Singleton
    @Provides
    fun getRetrofit() : Retrofit{
        return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Singleton
    @Provides
    fun getLoginAPIService(retrofit: Retrofit):LoginService {
        return retrofit.create(LoginService::class.java)
    }
}

这是我的匕首组件

 @Singleton
@Component(modules = [NetworkingModule::class])
interface ApplicationComponent {
    
}

尝试访问 LoginViewModel 中的服务变量时出现错误“lateinit 属性服务尚未初始化”

标签: androidmvvmretrofitdagger-2

解决方案


  1. 首先定义一个ViewModel作为参数的方法

    @Singleton
    @Component(modules = [NetworkingModule::class]) 
    interface ApplicationComponent {
    public void injectInViewModel(ViewModel viewModel); }
  1. Makeviewmodel您在内部init块中投影和构建组件。
    init{
               mComponent = DaggerApplicationComponent.create().injectInViewModel(this);
           }
    

推荐阅读