ViewModel 中的 Kotlin Dagger 字段注入引发 Dagger/Binding 异常

2023-12-08

我已关注本教程为了在我的视图模型中进行 DI。但我目前陷入困境。

我为我的视图模型创建了一个 ViewModelFactory ,如下所示:

class HomeViewModelFactory @Inject constructor(
    private val creators: Map<Class<out ViewModel>,
            Provider<ViewModel>>
): ViewModelProvider.Factory{

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return creators[modelClass]?.get() as T
    }
}

接下来是 ViewModel:

class HomeViewModel @Inject constructor(private val songsRepository: SongsRepository): ViewModel()

对于 DI,我创建了两个组件。一个是我的主应用程序组件,另一个是依赖于主应用程序的组件。

@Singleton
@Component(modules = [AppModule::class])
public interface AppComponent {
    fun songRepository(): SongsRepository
    fun libraryManager(): LibraryManager
    fun inject(mainActivity: MainActivity)
}


@Module
public class AppModule(val application: Application){

    @Provides @Singleton
    fun providesApplication(): Application{
        return application
    }

    @Provides @Singleton
    fun providesLibraryManager(): LibraryManager {
        return LibraryManager(application)
    }

    @Provides @Singleton
    fun providesSongRepository(libraryManager: LibraryManager): SongsRepository {
        return SongsRepository(libraryManager)
    }
}

我的 ViewModelModule 如下:

@Module
public class ViewModelModule {

    @Target(AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.RUNTIME)
    @MapKey
    internal annotation class ViewModelKey(val value: KClass<out ViewModel>)

    @AppScope
    @Provides
    fun providesHomeViewModelFactory(providerMap: Map<Class<out ViewModel>, Provider<ViewModel>>): HomeViewModelFactory {
        return HomeViewModelFactory(providerMap)
    }

    @AppScope
    @IntoMap
    @Provides
    @ViewModelKey(HomeViewModel::class)
    fun providesHomeViewModel(songsRepository: SongsRepository): HomeViewModel{
        return HomeViewModel(songsRepository)
    }
}

@AppScope
@Component(modules = [ViewModelModule::class], dependencies = [AppComponent::class])
public interface ViewModelComponent {
    fun homeViewModelFactory(): HomeViewModelFactory
    fun homeViewModel(): HomeViewModel
    fun inject(homeFragment: HomeFragment)
}

我收到的错误是这样的:

错误:[Dagger/MissingBinding] java.util.Map,?延伸 javax.inject.Provider> 不能 不带 @Provides 注释的方法提供。

我真的不知道为什么会发生这种情况,因为我的所有类都有 @Inject 构造函数。 Dagger 的文档也没有帮助我。如果您能就此事向我提供建议,我将不胜感激。


错误信息表明以下代码是错误的:

fun providesHomeViewModelFactory(providerMap: Map<Class<out ViewModel>, Provider<ViewModel>>): HomeViewModelFactory {
    return HomeViewModelFactory(providerMap)
}

它应该是

fun providesHomeViewModelFactory(providerMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>): HomeViewModelFactory {
    return HomeViewModelFactory(providerMap)
}

这是因为签名Map接口是Map<K, out V>,这意味着Map<..., Provider<ViewModel>>将被编译为Map<..., ? extends Provider<ViewModel>>Java 代码,因此您向 dagger 请求后一种,但它的对象图中只有前一种,然后编译器会向您抛出错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewModel 中的 Kotlin Dagger 字段注入引发 Dagger/Binding 异常 的相关文章

  • 如何在 Android 中保存相机的临时照片?

    在尝试从相机拍照并将其保存到应用程序的缓存文件夹中时 我没有得到任何可见的结果 应用程序不会崩溃 但在 LogCat 上 当我尝试将 ImageView src 字段设置为刚刚获取的文件的 URI 时 我收到此消息 09 17 14 03
  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • 在 ViewPager Fragments 中使用 Master/Detail 模板(下载链接)

    工作代码 https github com lukeallison ViewPagerMasterDetail https github com lukeallison ViewPagerMasterDetail Android 主 详细流
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐

  • Asp.Net Core 中的本地化

    我一直按照此页面上的说明来设置本地化 https learn microsoft com en us aspnet core fundamentals localization 然而 对我来说 这似乎不起作用 这是我所做的 启动 cs pu
  • 使用 Nuget Core DLL 设置包凭据

    我想通过 Http 身份验证获取私有源中的包列表 这是我的代码 当我调用列表插件方法时 出现 401 错误 如何设置凭据 public class PluginManager private readonly string pluginFo
  • Rails 3.1,jQuery UI 不加载

    我正在使用 Rails 3 1 并且 jQueryUI 库有问题 这是我的application js file require jquery require jquery ui require jquery ujs Loads all B
  • Android 的非阻塞 IO

    我目前正在尝试评估一个项目是否可以在Android上实现 我认为一个主要问题是 由于它是 P2P 客户端 因此我们必须在运行时保持大量连接打开 现在连接不会传输大量数据 它更像是一个消息系统 因此如果我们时不时地读取一条 64 字节的消息
  • 使用AssetPath创建NSURL

    使用 UIImagePickerController 我能够获取媒体的资源路径 例如assets library asset asset MOV id 2A2CE6C9 C178 4395 977B E6F159BF6D5E ext MOV
  • 了解 java.util.Calendar WEEK_OF_YEAR [重复]

    这个问题在这里已经有答案了 我试图理解如何java util Calendar get java util Calendar WEEK OF YEAR 有效 但似乎我遗漏了一些要点 String time 1998 12 31 year m
  • 适用于 C++ 的良好 Windows 注册表包装

    有谁知道有什么好的免费 开源 Windows 注册表包装器适用于 VC 不需要 MFC 即可以在控制台应用程序中运行 ATL 附带了一个基本的CRegKey可能适合您的需求并且易于从控制台应用程序使用的包装器
  • 第 2 部分:由 UI 启动的持久前台 android 服务,也可以在睡眠模式下工作,也可以在手机重启时启动

    Status 真的很感谢 to all 谁帮助了并在此处和第 1 部分中进行指导 我已经做了代码出于研究和提供的帮助以及已将该工作代码放入 EDIT 1 欢迎批评 以使代码变得更好 Scenario 我问了第 1 部分中提到的问题 但出于某
  • “insertAdjacentHTML 不会破坏现有 DOM”是什么意思?

    insertAdjacentHTML doesn t corrupt what s already in the DOM 我刚刚在 Mozilla 博客上读到了有关 insertAdjacentHTML 实现的文章 这是什么意思 这意味着它
  • 使用 atob() 方法时出现无效字符错误

    我读过堆栈溢出中的一个问题 这段代码在 IE 10 中工作 但在 ie9 中不起作用 但我仍然面临着这个问题 var image canvas toDataURL image image replace data a z var byteS
  • 用于PHP开发的声音库[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想在 php 项目中使用声音库 需要类似的功能 高性能 声音优化 开源 混合声音 这是最好的 PECL 套装吗 有 github 或 source
  • Java InetAddress.getHostName() 执行时间很长

    我有以下小代码片段 InetAddress address InetAddress getByName host if address isReachable TIMEOUT IN MILLISECONDS System out print
  • 如何在容器中存储具有不同签名的功能对象?

    假设我们有 2 个函数 void void and std string int std string 我们还可以再有 10 个 所有 或其中一些 接受不同的参数类型 并且可以返回不同的类型 我们想将它们存储在std map 所以我们得到这
  • 我们可以使用在 RGB 图像上训练的模型的权重来处理灰度图像吗?

    实际上 我正在尝试使用从 Image Net 上预先训练的初始模型到我的灰度数据集的迁移学习 所以我只想知道我可以使用相同的权重 还是应该在使用权重之前先进行一些更改 提前致谢 有几个选项可供选择 使用标准 OpenCV 函数将灰度图像转换
  • 如何在提交后回滚数据库更改?

    我在没有使用 where 子句的情况下进行了数据库更新 并在没有进行任何备份的情况下提交 表中的所有行均已更新 有什么办法可以回滚更改吗 数据库是 Oracle SQL 数据库 请帮忙 你可以使用倒叙特征 1 SCN闪回 SELECT co
  • 如何使用 tkInter 显示询问用户多项选择问题的对话框?

    不管怎样 我一直在寻找一个向用户询问多项选择问题的 tkinter 函数 我发现的最接近的是 messagebox asknoyes 但它只提供 2 个选择 而且我无法编辑选项它们是固定的 是或否 是否有一个 tkinter 函数可以完成我
  • 在Python中缓存类属性

    我正在用 python 编写一个类 并且有一个属性需要相对较长的时间来计算 所以我只想做一次 此外 并不是该类的每个实例都需要它 所以我不想默认这样做 in init 我是 Python 新手 但不是编程新手 我可以很容易地想出一种方法来做
  • 如果我使用 OWIN Startup.cs 类并将所有配置移至那里,我是否需要 Global.asax.cs 文件?

    比方说 在一个由带有个人帐户模板的 MVC 制作的全新 ASP NET MVC 5 应用程序中 如果我删除Global asax cs类并将其配置代码移至Startup cs Configuration 方法如下 有什么缺点 public
  • strncpy() 是 memcpy() 的特化吗?

    只是想知道 因为我们经常使用这些函数 我认为两者之间没有任何实际区别strncpy and memcpy 难道不值得有效地说 char strncpy char dst const char src size t size return c
  • ViewModel 中的 Kotlin Dagger 字段注入引发 Dagger/Binding 异常

    我已关注本教程为了在我的视图模型中进行 DI 但我目前陷入困境 我为我的视图模型创建了一个 ViewModelFactory 如下所示 class HomeViewModelFactory Inject constructor privat