当前位置: 首页 > 知识库问答 >
问题:

如何使用hilt为ViewModel(通过调用创建ViewModel)注入RepositoryManager?

危晨
2023-03-14

这是我的存储库管理器

@Singleton
class RepositoryManager @Inject constructor(private val retrofit: Retrofit) {

    fun <T> obtainRetrofitService(serviceClass: Class<T>): T {
        return retrofit.create(serviceClass)
    }

}

class GankViewModel @ViewModelInject constructor() : BaseViewModel() {

    @Inject lateinit var repositoryManager: RepositoryManager

    fun getGankGirl() {
        repositoryManager.obtainRetrofitService(GankApi::class.java)
            .getGankGirls()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : BaseObserver<GirlBean>() {
                override fun success(data: GirlBean) {
                    showLoading(true)
                }
            })
    }
}

@AndroidEntryPoint
class GankActivity : BaseActivity<ActivityGankBinding, GankViewModel>() {

    override fun init() {
        viewModel.getGankGirl()
    }

}
abstract class BaseActivity<VB : ViewBinding, VM : BaseViewModel> :RxFragmentActivity(),
    IBaseView {
    protected lateinit var binding: VB
    protected lateinit var viewModel: VM
    private val loading: BasePopupView by lazy {
        XPopup.Builder(this).asCustom(LoadingSimplePopup(this))
    }

    @Suppress("UNCHECKED_CAST")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val type = javaClass.genericSuperclass as ParameterizedType
        val modelProvider = ViewModelProvider(this)

        val clazz0 = type.actualTypeArguments[0] as Class<VB>
        val method = clazz0.getMethod("inflate", LayoutInflater::class.java)
        binding = method.invoke(null, layoutInflater) as VB
        setContentView(binding.root)

        val clazz1 = type.actualTypeArguments[1] as Class<VM>
        viewModel = modelProvider.get(clazz1)

        init()

        viewModel.loadingEvent.observe(this, { isShow ->
            if (isShow) showLoading() else dismissLoading()
        })
    }

    abstract fun init()

    override fun showLoading() {
        if (!loading.isShow) {
            loading.show()
        }
    }

    override fun dismissLoading() {
        if (loading.isShow) {
            loading.dismiss()
        }
    }

}

和例外情况:

共有1个答案

左丘烨烁
2023-03-14

您只需要修复您的ViewModel

class GankViewModel @ViewModelInject constructor(var repositoryManager: RepositoryManager) : BaseViewModel() {
... }

如果你能再检查一遍

 类似资料:
  • 我只是从喷气背包和剑柄开始。但是当我注入到ViewModel中时,我遇到了一些问题。 我得到的错误: 我可以在活动中注入所有细节,但不能在ViewModel中注入。我已经尝试了所有我能找到的解决办法。 我的gradle文件: 项目根级别: 模块级: 我的申请文件 我的模块文件: 项目是具有可组合屏幕的单个活动,因此主要活动: 视图模型: 我尝试过的事情: 改为ViewModelComponent而

  • 这是我的束缚 错误在于 /Users/X/AndroidStudioProjects/Corotuines/app/build/generated/source/kapt/debug/com/example/corotuines/application/ApplicationMain_HiltComponents.java:126:错误:[Dagger/Mis的绑定]com.example.cor

  • 我试着把一个简单的viewModel交给一个composable,每次出现这个错误,我都不知道这意味着什么: 我的分级: 我创建了一个文件 并将其设置在清单中。 我创建了文件: 然后在我的中设置并创建一个,如下所示: 在我的导航中的处调用: null

  • 我通过MVVM模式和谷歌jetpack依赖性开发了一个应用程序。我有一个,它有一个我需要的方法。我有两个视图,分别是和,首先我在中创建了实例,并通过ViewModel向观察者订阅LiveData: 现在,我将在中执行操作方法,并观察 但我跟踪创建实例

  • ViewModels是独立于activity/片段生命周期还是仅仅独立于其配置更改。它们何时将不再存在,随后的onCleared()方法将被调用。viewModel可以与另一个activity共享吗? 一种情况: 这种分享是否可能,是否是一种好的做法。 此外,由于应用程序生命周期回调,onpause->onstop->ondestroy对这两个程序都是相同的 1.activity旋转和 2.act

  • 我正在使用匕首2,我有一个定义如下的: 这是FYViewModel的: 但是,变量始终为空。 如何使用匕首2将Repositroy注入我的ViewModel?