【问题标题】:How can i user hilt Inject RepositoryManager for ViewModel(viewmodel creat by invoke)?我如何为 ViewModel 注入 RepositoryManager(viewmodel 通过调用创建)?
【发布时间】:2021-04-07 11:42:18
【问题描述】:

这是我的 RepositoryManager

@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()
        }
    }

}

还有例外:

E/AndroidRuntime: 致命异常: main 进程:com.kotlin,PID:20050 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.kotlin/com.cmy.domain.ui.gank.ui.GankActivity}: kotlin.UninitializedPropertyAccessException:lateinit 属性 repositoryManager 尚未初始化 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3897) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:219) 在 android.app.ActivityThread.main(ActivityThread.java:8349) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055) 引起:kotlin.UninitializedPropertyAccessException:lateinit属性repositoryManager尚未初始化 在 com.cmy.domain.ui.gank.vm.GankViewModel.getGankGirl(GankViewModel.kt:19) 在 com.cmy.domain.ui.gank.ui.GankActivity.init(GankActivity.kt:32) 在 com.cmy.common.ui.base.BaseActivity.onCreate(BaseActivity.kt:38) 在 com.cmy.domain.ui.gank.ui.Hilt_GankActivity.onCreate(Hilt_GankActivity.java:30) 在 android.app.Activity.performCreate(Activity.java:8085) 在 android.app.Activity.performCreate(Activity.java:8073) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3870) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:219) 在 android.app.ActivityThread.main(ActivityThread.java:8349) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)

【问题讨论】:

标签: android kotlin mvvm dagger-hilt


【解决方案1】:

你只需要修复你的 ViewModel

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

如果可以再检查一下

【讨论】:

  • 感谢您的回答,我尝试修复我的视图模型,现在它有另一个异常`无法创建类 com.cmy.domain.ui.gank.vm.GankViewModel 的实例......在 com.cmy.common.ui.base.BaseActivity.onCreate(BaseActivity.kt:36) 在 com.cmy.domain.ui.gank.ui.Hilt_GankActivity.onCreate(Hilt_GankActivity.java:30)`
  • 你可以尝试 get viewmodel by extension // 通过 viewModels() 获取对这个 GrankActivity val viewModel 范围内的 ViewModel 的引用
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多