未使用dagger2在ViewModel中注入改造服务类

时间:2020-08-12 07:47:36

标签: android mvvm retrofit dagger-2

我试图在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)
    }
}

这是我的Dagger组件

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

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

1 个答案:

答案 0 :(得分:0)

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

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