android HiltView模型:无法创建类的示例

nuypyhwy  于 2023-01-19  发布在  Android
关注(0)|答案(3)|浏览(134)

我正在使用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所建议的那样,错误消失了。

zbq4xfa0

zbq4xfa01#

随着新的刀柄版本很多东西已经改变。
您还必须升级您的hilt android、hilt编译器和hilt gradle插件,以:2.31-alpha
我做了模拟样本完全一样,你做了我有同样的问题,在通过hilt的文档后,我发现了新的方法来注入依赖关系到viewModel,你必须为依赖关系制作单独的模块,这将注入到viewModel与特殊组件称为ViewModelComponent

@Module
@InstallIn(ViewModelComponent::class) // this is new
object RepositoryModule{

    @Provides
    @ViewModelScoped // this is new
    fun providesRepo(): ReposiotryIMPL { // this is just fake repository
        return ReposiotryIMPL()
    }

}

以下是docs对ViewModelComponentViewModelScoped的说明
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
然后选择视图模型:

@HiltViewModel
class RepoViewModel @Inject constructor(
    application: Application,
    private val reposiotryIMPL: ReposiotryIMPL
) : AndroidViewModel(application) {}
    • 更新**

这不是强制性的,你应该使用ViewModelComponentViewModelScoped,就像我在上面的例子中所做的那样。你也可以根据你的使用情况使用其他的scopescomponents
另外看过相关资料,我把剑柄的链接放在上面。

e37o9pze

e37o9pze2#

当使用ViewModel的Fragment/Activity缺少***@AndroidEntryPoint***注解时,我曾看到过这种情况,例如:

import androidx.fragment.app.viewModels

@AndroidEntryPoint
class SampleFragment: BaseFragment() {
     val viewModel: SampleFragmentViewModel by viewModels()
}

如果注解不存在,将发生与您描述的完全相同的错误。

x4shl7ld

x4shl7ld3#

我的错误是一个愚蠢的错误,这可能会帮助未来的人,添加一个视图模型到一个功能模块,我忘记添加kapthilt依赖到功能的build.gradle文件,这意味着希尔特将永远不会看到视图模型。

相关问题