android - 使用 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 属性服务尚未初始化”
解决方案
- 首先定义一个
ViewModel
作为参数的方法
@Singleton
@Component(modules = [NetworkingModule::class])
interface ApplicationComponent {
public void injectInViewModel(ViewModel viewModel); }
Make
viewmodel
您在内部init
块中投影和构建组件。
init{
mComponent = DaggerApplicationComponent.create().injectInViewModel(this);
}
推荐阅读
- python - 如何打印键是整数的字典元素?
- php - 如何在空表上添加记录
- javascript - 从 Woocommerce 有效负载中提取对象并从字符串中删除反斜杠
- c# - 如何在没有实体框架的情况下以通用方式在 C# 中调用异步存储过程调用
- firebase - 使用螺栓编译器的 hasChild() 问题
- css - “(property)”:(value)”声明中的冒号 (':') 前缺少属性名称。css 全局变量
- c# - await Task.Run 实际上并不等待
- ios - 在ios设备上本地保存json时采取什么方法?
- c - 在编写合并两个排序链表的代码时获取地址错误的运行时负载
- c++ - 从函数指针类型间接推导出的转发参数