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

我无法提供ViewModel

锺离锦
2023-03-14

当我在@ContributesAndroidInjector(modules=[MainFragmentBuilderModule::Class,LoginViewModelProviderModule::Class])中包含LoginViewModelProviderModule时,我无法使用LoginViewModelProviderModule提供LoginViewModel,但当我在ActivityBuilderModule类的@Module注释中包含它时,它可以工作。

BaseApplicationComponent

@Suppress("unused")
@Singleton
@Component(
    modules = [AndroidInjectionModule::class,
        ActivityBuilderModule::class,
        ViewModelFactoryModule::class]
)
interface BaseApplicationComponent : AndroidInjector<BaseApplicationClass> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): BaseApplicationComponent
    }
}

ActivityBuilderModule

@Module
abstract class ActivityBuilderModule {

    @LoginScope
    @ContributesAndroidInjector(modules = [MainFragmentBuilderModule::class, LoginViewModelProviderModule::class])
    abstract fun contributeMainActivity(): MainActivity
}
@Module
abstract class MainFragmentBuilderModule {

    @ContributesAndroidInjector
    abstract fun contributesLoginFragment(): LoginFragment
}

LoginViewModelProviderModule

@Suppress("unused")
@Module
abstract class LoginViewModelProviderModule {
    @Binds
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    abstract fun bindLoginViewModel(viewModel: LoginViewModel): ViewModel
}

ViewModelFactoryModule

@Module
abstract class ViewModelFactoryModule {

    @Binds
    abstract fun bindViewModelFactory(viewModelProviderFactory: ViewModelProviderFactory): ViewModelProvider.Factory
}

ViewModelProviderFactory

@Singleton
class ViewModelProviderFactory @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") as Throwable
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
}
@Scope
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class LoginScope 
@MustBeDocumented
@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

共有1个答案

令狐昂雄
2023-03-14

只能在应用程序中创建viewmodel的模块bind all。您可以在我的示例应用程序中看到详细信息:sample-moviedb-app

BaseApplicationComponent:

@Suppress("unused")
@Singleton
@Component(
    modules = [AndroidInjectionModule::class,
        ActivityBuilderModule::class,
        ViewModelFactoryModule::class,
        ViewModelModule::class]

)
interface BaseApplicationComponent : AndroidInjector<BaseApplicationClass> {
    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): BaseApplicationComponent
    }
}

ViewModelModule:

@Suppress("unused")
@Module
abstract class ViewModelProviderModule {
    @Binds
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    abstract fun bindLoginViewModel(viewModel: LoginViewModel): ViewModel

//other viewmodels in application
   @Binds
   abstract fun bindViewModelFactory(viewModelProviderFactory:ViewModelProviderFactory): ViewModelProvider.Factory
}

主模块:

@Module
class MainModule {
    @MainActivityScope
    @Provides
    fun provideViewModel(mainActivity: MainActivity, viewModelFactory: ViewModelProviderFactory) =
        ViewModelProviders.of(mainActivity, viewModelFactory).get(LoginViewModel::class.java)
}
class LoginViewModel @Inject constructor(
) : ViewModel() {

}
 类似资料:
  • 我在OS/X上使用Mamp Free版本安装了一个简单的wordpress。 版本2.0.19/2.0.19 Web界面h#tp#//127.0.0.1:4040 转发h#tp#//6c219c8e。韩国。io- 由于某种原因,当我尝试由ngrok生成的链接时,网站会永远加载,然后我得到 页面不可用。

  • 承认,匕首是强硬的,我正试图注射改型。我注入了Context和SharedPreferences,它工作得很好,但改型破坏了这一切。它可以识别DaggerRetrofitComponent类,但不能找到DaggerAppComponent。

  • null 如在第一个链接中所回答的,尝试类路径 正如第二个链接中所回答的,尝试了Multidex也没有成功。 注意:示例代码正在运行。 更新: 有趣的是,即使我只添加依赖项,也会出现同样的错误

  • 在和之后 在启动应用程序时,我开始得到以下错误: 在下一行中还添加了:

  • 我是Java和Vert.x的新手 我收到一个编译器错误。对于类型HttpRequest我做错了什么,方法basicAuthentication(String,String)未定义。

  • 问题内容: 这是我的项目文件夹 这是我index.js中的静态文件配置 这是我的index.html 这是我的nginx配置 但是我在所有脚本上都得到404。另一个奇怪的是,这些文件上的mime-type设置为 我在这里做错了什么? 我有一个项目,该项目具有相同的项目结构,并且具有相同的配置,但它适用于此项目,在这种情况下不起作用。 问题答案: 您无需配置Nginx 和 Express即可提供静态