我正在使用Hilt。在升级到1.0.0-alpha03
后,我收到警告说@ViewModelInject
已过时,我应该使用@HiltViewModel
。但当我更改它时,我收到一个错误:
java.lang.RuntimeException: Cannot create an instance of class com.example.LoginViewModel
...
Caused by: java.lang.NoSuchMethodException: com.example.LoginViewModel.<init> [class android.app.Application]
以前我的ViewModel看起来像这样:
class LoginViewModel @ViewModelInject constructor(
application: Application,
private val repository: RealtimeDatabaseRepository
) : AndroidViewModel(application)
现在它看起来像这样:
@HiltViewModel
class LoginViewModel @Inject constructor(
application: Application,
private val repository: RealtimeDatabaseRepository
) : AndroidViewModel(application)
注入ViewModel的片段:
@AndroidEntryPoint
class LoginFragment : Fragment(R.layout.fragment_login)
{
private val viewModel: LoginViewModel by activityViewModels()
}
注入类:
@Singleton
class RealtimeDatabaseRepository @Inject constructor() { }
当我从ViewModel构造函数中删除private val repository: RealtimeDatabaseRepository
时,它仍在工作
当我更新到2.31.2-alpha
时,我正在使用2.30.1-alpha
版本的剑柄,正如USMAN osman所建议的那样,错误消失了。
3条答案
按热度按时间zbq4xfa01#
随着新的刀柄版本很多东西已经改变。
您还必须升级您的hilt android、hilt编译器和hilt gradle插件,以:
2.31-alpha
我做了模拟样本完全一样,你做了我有同样的问题,在通过hilt的文档后,我发现了新的方法来注入依赖关系到viewModel,你必须为依赖关系制作单独的模块,这将注入到
viewModel
与特殊组件称为ViewModelComponent
:以下是docs对
ViewModelComponent
和ViewModelScoped
的说明All Hilt View Models are provided by the ViewModelComponent which follows the same lifecycle as a ViewModel, i.e. it survives configuration changes. To scope a dependency to a ViewModel use the @ViewModelScoped annotation.
A @ViewModelScoped type will make it so that a single instance of the scoped type is provided across all dependencies injected into the Hilt View Model.
链接:https://dagger.dev/hilt/view-model.html
然后选择视图模型:
这不是强制性的,你应该使用
ViewModelComponent
或ViewModelScoped
,就像我在上面的例子中所做的那样。你也可以根据你的使用情况使用其他的scopes
或components
。另外看过相关资料,我把剑柄的链接放在上面。
e37o9pze2#
当使用ViewModel的Fragment/Activity缺少***@AndroidEntryPoint***注解时,我曾看到过这种情况,例如:
如果注解不存在,将发生与您描述的完全相同的错误。
x4shl7ld3#
我的错误是一个愚蠢的错误,这可能会帮助未来的人,添加一个视图模型到一个功能模块,我忘记添加
kapt
和hilt
依赖到功能的build.gradle
文件,这意味着希尔特将永远不会看到视图模型。