Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中带有Kotlin的Dagger:lateinit属性viewModelProviderFactory尚未初始化_Android_Kotlin_Dagger - Fatal编程技术网

Android中带有Kotlin的Dagger:lateinit属性viewModelProviderFactory尚未初始化

Android中带有Kotlin的Dagger:lateinit属性viewModelProviderFactory尚未初始化,android,kotlin,dagger,Android,Kotlin,Dagger,我的代码: 应用程序组件: MainActivityViewModelModule: MainActivityViewModel: ViewModelKey(在Java中): @已记录 @目标({ElementType.METHOD}) @保留(RetentionPolicy.RUNTIME) @地图键 public@interface ViewModelKey{ Class扩展DaggerAppCompatActivity而不是AppCompatActivity这里我可能错了,但我认为您的vi

我的代码:

  • 应用程序组件:
  • MainActivityViewModelModule:
  • MainActivityViewModel:
  • ViewModelKey(在Java中):
  • @已记录
    @目标({ElementType.METHOD})
    @保留(RetentionPolicy.RUNTIME)
    @地图键
    public@interface ViewModelKey{
    
    Class扩展DaggerAppCompatActivity而不是AppCompatActivity

    这里我可能错了,但我认为您的viewModelModule中需要一个ViewModelFactory,如下所示:

    @Module
    abstract class MainActivityViewModelModule {
    
        @Binds
        @IntoMap
        @ViewModelKey(MainActivityViewModel::class)
        public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
    
    
        @Binds
        abstract fun provideViewModelFactory(
            factory: ViewModelFactory
        ): ViewModelProvider.Factory
    
    }
    
    class ViewModelFactory@Inject构造函数(
    私有val创建者:映射
    ):ViewModelProvider.Factory{
    重写趣味创建(modelClass:Class):T{
    val creator=creators[modelClass]?:creators.entries.firstOrNull{
    modelClass.isAssignableFrom(it.key)
    }?值?:抛出IllegalArgumentException(“未知模型类$modelClass”)
    试一试{
    @抑制(“未选中的_CAST”)
    将creator.get()返回为T
    }捕获(e:例外){
    抛出运行时异常(e)
    }
    }
    }
    
    噢,老兄,在这种情况下,您所做的比任何错误日志都要多
    @Module
    abstract class ActivityBuildersModule {
    
        @ContributesAndroidInjector(
            modules = [MainActivityViewModelModule::class]
        )
        abstract fun contributeMainActivity(): MainActivity
    }
    
    @Module
    abstract class MainActivityViewModelModule {
    
        @Binds
        @IntoMap
        @ViewModelKey(MainActivityViewModel::class)
        public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
    }
    
    class MainActivityViewModel @Inject constructor(application: Application) : AndroidViewModel(application) {
       // empty for now
    }
    
    @Documented
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @MapKey
    public @interface ViewModelKey {
    
        Class<? extends ViewModel> value();
    }
    
    class MainActivity : AppCompatActivity() { <-- I made mistake here. I must Extend DaggerAppCompatActivity instead of AppCompatActivity.
    
    //  doesn't work for now
        @Inject
        lateinit var viewModelProviderFactory: ViewModelProviderFactory
    
        lateinit var mainActivityViewModel: MainActivityViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            setContentView(R.layout.activity_main)
    
            mainActivityViewModel = ViewModelProvider(this, viewModelProviderFactory).get(MainActivityViewModel::class.java)
    
            setMainFragment()
        }
    
        private fun setMainFragment() {
            // my code
        }
    }
    
    @Module
    abstract class MainActivityViewModelModule {
    
        @Binds
        @IntoMap
        @ViewModelKey(MainActivityViewModel::class)
        public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
    
    
        @Binds
        abstract fun provideViewModelFactory(
            factory: ViewModelFactory
        ): ViewModelProvider.Factory
    
    }
    
    class ViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
    ) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            val creator = creators[modelClass] ?: creators.entries.firstOrNull {
                modelClass.isAssignableFrom(it.key)
            }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
            try {
                @Suppress("UNCHECKED_CAST")
                return creator.get() as T
            } catch (e: Exception) {
                throw RuntimeException(e)
            }
    
        }
    }