Android+Hilt:无法创建ViewModel的示例

ebdffaop  于 2022-09-21  发布在  Android
关注(0)|答案(1)|浏览(298)

首先,我的应用程序是一个多模块应用程序。

MainActivity通过以下方式创建RecordsViewModel的示例:

private lateinit var recordsViewModel: RecordsViewModel
...
recordsViewModel = ViewModelProvider(this)[RecordsViewModel::class.java]

我的RecordsViewModel定义:

@HiltViewModel
class RecordsViewModel
@Inject constructor(
    private val userService: IUserService,
    private val testService: ITestService,
    private val testTypeService: ITestTypeService,
    private val tmTest: TMTest) : ViewModel() {

    private val recordsResult: MutableLiveData<String> = MutableLiveData()

RecordsViewModel需要的所有接口都定义在“Core”模块中(Main有权访问Core),并在一个名为Dependency的类/模块中提供(位于“Services”模块中,“Core”有权访问):

@Module
@InstallIn(SingletonComponent::class)
abstract class Dependencies {

    @Binds
    @Singleton
    abstract fun bindsTestService(
        testService: TestService
    ): ITestService

    @Binds
    @Singleton
    abstract fun bindsUserService(
        userService: UserService
    ): IUserService

    @Binds
    @Singleton
    abstract fun bindsTestTypeService(
        testTypeService: TestTypeService
    ): ITestTypeService
}

但在示例化RecordsViewModel时,抛出了下一个异常:

无法创建RecordsViewModel的示例,原因是:java.lang.Class<com.xxx.xxx.ui.activities.test.records.RecordsViewModel>。示例异常:java.lang.InstantiationException没有零参数构造函数

当然它没有零参数构造函数!它有依赖关系!而Hilt应该处理这一点,这就是为什么我们有@HiltViewModel装饰器。

好吧,我不确定它有什么关系,但如果你看,我没有在任何模块中提供TMTest-这是一个RecordsViewModel依赖项-首先,因为我不确定我必须这样做,第二,因为TMTest有许多其他依赖项,使我不知道如何处理TMTest提供(仍然不确定错误来自于没有提供TMTest)。

我试过了:

@Provides
@Singleton
fun provideTMTest(tmTest: TMTest): TMTest {
    return tmTest
}

但这导致了我不知道如何处理的“循环”依赖关系。

其他选项可以是:

@Provides
@Singleton
fun provideTMTest(): TMTest {
    return TMTest(TMSecurity(AppRunService),TMSettings(),...)
}

但这永远不会结束,因为每个TMTest依赖项都有一些其他依赖项,我甚至不知道这是不是提供一个同时具有更多依赖项的其他依赖项的正确方法……

我被困在无法创建RecordsViewModel的情况下。

mmvthczy

mmvthczy1#

好的,我自己找到了解决方案,这是一个非常愚蠢的问题。

我忘记了片断上的@androidEntryPoint修饰符:

@AndroidEntryPoint
class ResumeSectionFragment : Fragment() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var recordsViewModel: RecordsViewModel

    @Suppress("UNCHECKED_CAST")
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        recordsViewModel = ViewModelProvider(this)[RecordsViewModel::class.java]

相关问题