错误:[Dagger/MissingBinding] Map、Provider>

2023-12-03

我有 Dagger/MissingBinding 的问题。我在 stackoverflow 上红色了所有相关答案,我尝试使用不同版本的 kotlin、gradle、dagger,我尝试使用不同的解决方法,例如kapt { correctErrorTypes = true } and kapt { generateStubs = true },但问题仍然继续。

错误看起来像:

E:\AndroidStudioPrjcts\windygo\app\src\main\java\app\windygo\dagger\AppComponent.java:12: error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
public interface AppComponent {
       ^
      java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
          app.windygo.ui.DefaultViewModelFactory(creators)
      app.windygo.ui.DefaultViewModelFactory is injected at
          app.windygo.dagger.ViewModelModule.bindDefaultViewModelFactory(factory)
      androidx.lifecycle.ViewModelProvider.Factory is injected at
          app.windygo.dagger.DaggerWrapper.factory
      app.windygo.dagger.DaggerWrapper is injected at
          app.windygo.dagger.AppComponent.inject(app.windygo.dagger.DaggerWrapper)

还有我的资料来源:

应用组件.java

package app.windygo.dagger;

import android.content.Context;

import javax.inject.Singleton;

import dagger.BindsInstance;
import dagger.Component;

@Singleton
@Component(modules = { AppModule.class, ViewModelModule.class })
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance Builder context(Context context);
        AppComponent build();
    }

    void inject(DaggerWrapper wrapper);
}

应用程序模块.java

package app.windygo.dagger;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import javax.inject.Singleton;

import app.windygo.BuildConfig;
import app.windygo.api.LiveDataCallAdapterFactory;
import app.windygo.api.WindyGoSource;
import dagger.Module;
import dagger.Provides;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

@Module
public class AppModule {
    @Singleton
    @Provides
    HttpLoggingInterceptor getInterceptor() {
        return new HttpLoggingInterceptor(/*new ApiLogger()*/);
    }

    @Singleton
    @Provides
    HttpLoggingInterceptor.Level getLogLevel() {
        return BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE;
    }

    @Singleton
    @Provides
    WindyGoSource provideGoodwineService() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(chain -> {
            Request original = chain.request();

            String token = original.header(WindyGoSource.HEADER_AUTHORIZATION);
            if (token != null) {
                Request.Builder requestBuilder = original.newBuilder()
                        .header("Authorization", "Bearer " + token);

                original = requestBuilder.build();
            }
            return chain.proceed(original);
        });
        builder.addNetworkInterceptor(getInterceptor().setLevel(getLogLevel()));
        OkHttpClient client = builder.build();

        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();

        return new Retrofit.Builder()
                .baseUrl(BuildConfig.API_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(new LiveDataCallAdapterFactory())
                .client(client)
                .build()
                .create(WindyGoSource.class);
    }

}

DaggerWrapper.java

package app.windygo.dagger;

import androidx.lifecycle.ViewModelProvider;

import javax.inject.Inject;

public class DaggerWrapper {

    @Inject
    ViewModelProvider.Factory factory;

    public ViewModelProvider.Factory getViewModelFactory() {
        return factory;
    }
}

ViewModelKey.java

package app.windygo.dagger;

import androidx.lifecycle.ViewModel;

import dagger.MapKey;

@MapKey
@interface ViewModelKey {
    Class<? extends ViewModel> value();
}

ViewModelModule.java

package app.windygo.dagger;

import androidx.lifecycle.ViewModelProvider;

import app.windygo.ui.DefaultViewModelFactory;
import dagger.Binds;
import dagger.Module;

@Module
public abstract class ViewModelModule {

    @Binds
    public abstract ViewModelProvider.Factory bindDefaultViewModelFactory(DefaultViewModelFactory factory);

}

DefaultViewModelFactory.java

package app.windygo.ui;

import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.annotation.NonNull;

import java.util.Map;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;

@Singleton
public class DefaultViewModelFactory implements ViewModelProvider.Factory {

    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;

    @Inject
    public DefaultViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
        this.creators = creators;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        Provider<? extends ViewModel> creator = creators.get(modelClass);
        if (creator == null) {
            throw new IllegalArgumentException("unknown model class " + modelClass);
        }

        try {
            return (T) creator.get();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

由于在配置 Dagger 2 时 kapt 和 kotlin 存在不同的问题,我使用 java 来处理 dagger 相关的类。但我什至尝试使用 Kotlin 重写这些类,但它没有解决我的问题。

最后,我的 build.gradle 文件:

构建.gradle(项目)

buildscript {
    ext.kotlin_version = '1.3.61'

    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath 'com.google.gms:google-services:4.3.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

构建.gradle(应用程序)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

def versionMajor = 1
def versionMinor = 0 // 0..9
def versionPatch = 0 // 0..9
def versionBuild = 0 // 0..99

static def getGitRevParseInfo(what) {
    def cmd = "git rev-parse " + what + " HEAD"
    def proc = cmd.execute()
    proc.text.trim()
}

android {
    compileSdkVersion 29
    defaultConfig {
        multiDexEnabled true
        applicationId "app.windygo"
        minSdkVersion 23
        targetSdkVersion 29
        versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
        versionName "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    // Dagger 2
    kapt "com.google.dagger:dagger-compiler:2.26"
    implementation "com.google.dagger:dagger:2.26"
    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.7.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.4.0'
    // ViewModel and LiveData
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0'
}

那么,请告诉我如何解决它的任何想法?


无需绑定至少一个ViewModel with ViewModelKey,dagger 不会创建提供以下功能的函数Map<Class<? extends ViewModel>, Provider<ViewModel>>

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

错误:[Dagger/MissingBinding] Map、Provider> 的相关文章

  • 在Android内存中存储gif图像

    我对安卓还很陌生 我想将图像保存到内存中 然后从内存中检索图像并将其加载到图像视图中 我已使用以下代码成功将图像存储在内存中 void saveImage String fileName img cnt jpg File file new
  • 无法找到/下载 AppCompat-v7:23.1.1

    怎么了 我遇到了很多 找不到 appcompat v7 23 1 1 的问题 许多解决方案都不起作用 经过几个小时的思考和寻找答案 我遇到了一个奇怪的问题 I have gotAndroid 支持库 23 1 1 已安装 所有功能 exce
  • 有没有办法替代Android中的标准Log?

    有没有办法以某种方式拦截对 android 中标准 Log 的调用并执行其他操作 在桌面 Java 中 人们通常会得到一些记录器 因此有多种方法可以安装不同的日志处理程序 实现 但是 Android似乎对Log有静态调用 我找不到任何有关替
  • Android Studio:Android 设备监视器未显示我的设备

    我的真实设备是索尼 Xperia c6502安卓版本4 3 我确定我将其连接到我的计算机然后打开开发者选项 USB调试 on 在 SDK 管理器中 Google USB 驱动程序已安装 I downloaded Xperia Z Drive
  • 如何在我的 Android 应用程序中实现应用内购买?

    如何在我的 Android 应用程序中实现应用内购买 我提到 http developer android com guide market billing billing integrate html billing service ht
  • 如何找到特定路线上两点之间的距离?

    我正在为我的大学开发一个 Android 应用程序 可以帮助学生跟踪大学巴士的当前位置 并为他们提供巴士到达他们的预计时间 截至目前 我获取了公交车的当前位置 通过公交车上的设备 和学生的位置 我陷入了必须找到两个 GPS 坐标之间的距离的
  • 仅在 Android 应用程序中使用 XHDPI 可绘制对象?

    如果您计划在不久的将来支持 LDPI MDPI HPDI 或许还有 XHDPI 那么是否可以在项目中仅包含 XHDPI 可绘制对象并让设备将其缩放到所需的分辨率 我已经测试过在 Photoshop 中将可绘制对象的大小调整为 MDPI 和
  • 如何将 Google Now 搜索栏添加到我的应用程序中?

    谷歌刚刚将其搜索栏从 Google Now 引入到了 Play 商店应用程序中 如下面的 gif 所示 如何将这个操作栏搜索栏实现到我自己的应用程序中 我想要 style 汉堡动画 从工具栏按钮访问 麦克风按钮 对棒棒糖设备的连锁反应 我已
  • 当编辑文本获得焦点时更改边框颜色

    我想知道当编辑文本聚焦时如何更改它的边框颜色 目前它看起来像这样 我尝试过在SDK中检查源图片 但我无法理解它 我也尝试过使用xml 但无法仅更改边框颜色 如果我找到源图片 我可以在 Photoshop 中编辑以更改颜色 有什么关于如何执行
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • Proguard - 找不到任何超级类

    我收到此错误 Unexpected error while performing partial evaluation Class org apache log4j chainsaw Main Method
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • 以编程方式应用样式资源

    我没有找到一种以编程方式做到这一点的方法 所以我在这里发布这个问题 我也没有找到与此相关的任何问题 我有一个资源样式 在 res values styles xml 中定义 我想做的是使用 java 将这种样式应用到我正在操作的 View
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • 在 Android ADT Eclipse 插件中滚动布局编辑器

    有谁知道当布局编辑器的内容溢出一个 屏幕 时如何滚动这些内容 我说的是在设计时使用 ADT 布局编辑器 而不是在物理设备上运行时滚动 效果很好 关闭 Android 布局编辑器中的剪辑 切换剪辑 按钮位于 Android 布局编辑器的右上角
  • 从多个 TextView 中选择文本

    如何在android中从多个文本视图中选择文本 我已经尝试过以下代码 该代码一次仅适用于一个文本视图 我想一次性从许多文本视图中复制文本 android textIsSelectable true 你不能同时这样做 您需要在单个文本视图中设
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 在上下文操作模式下选择时,ListView 项目不会在视觉上“突出显示”

    我关注了 Android 官方网站创建上下文操作菜单的教程 http developer android com guide topics ui menus html CAB 使用下面的代码 当我长按我的 ListView 项目之一时 它确
  • Android BLE 扫描永远找不到设备

    几天以来 我尝试在我的应用程序中实现 BLE 连接 我知道我尝试连接的设备功能齐全 因此问题一定是我的代码 我用BluetoothLeScanner startScan 方法 但回调方法永远不会被调用 public void startSc

随机推荐

  • Android - 为我的应用程序创建一个将从网页链接打开的架构

    我正在尝试创建一个类似 myapp somthing anotherthing 的架构 如果网页或任何其他应用程序链接到该架构将打开我的应用程序 我已将其添加到我的 AndroidManifest xml 中以用于我的主要活动
  • BufferGeometry 面材质

    使用 BufferGeometry 时 如何将材质分配给面 是否有类似数组包含相同信息的东西Face materialIndex BufferGeometry不支持MeshFaceMaterial
  • 将sql查询输出到html表中

    我试图将此 PHP SQL 查询的输出放入数据库表中 但它将所有行数据输出到一列中 if isset POST submit name htmlentities POST name parts explode name lastname a
  • OpenCV Mat 旋转得到错误结果

    我想将图像旋转 90 度 我的代码如下 int main int argc const char argv Mat img imread Users chuanliu Desktop src4 p00 JPG resize img img
  • 您没有 /var/lib/gems/2.3.0 目录的写权限

    我在 ubuntu 16 04 上安装了 ruby which ruby usr bin ruby ruby v ruby 2 3 0p0 2015 12 25 x86 64 linux gnu gem install bundler ER
  • 我可以使用 Liquid 模板在 Jekyll 中实现合适的平铺分页吗?

    I ve found this nice jekyll theme http www jacoporabolini com emerald with good looking pagination Unfortunately is only
  • 获取MySql数据并将其存储到Javascript数组中

    想要从 Mysql 检索记录数据并将其存储到 Javascript 数组中 以获取以下格式的 heatmap js 地图数据 var testData max 46 data lat 33 5363 lon 117 044 value 1
  • 什么时候我可以放心地用-O3编译程序?

    我见过很多人抱怨 O3 option GCC 程序无法使用编译选项 O3 浮点问题由 David Hammen 提供 我查看了 GCC 的手册 O3 Optimize yet more O3 turns on all optimizatio
  • Java EE 6 与 Spring 3 堆栈 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我现在正在开始一个新项目
  • 如何在 Angular 中重现 Angular JS .broadcast() / .on() 行为?

    我正在努力用 Angular8 重写 AngularJS 应用程序 我已经阅读了组件之间通信的不同方法 但鉴于我当前的要求 似乎无法找到实现此目的的正确方法 我目前有 2 个兄弟组件 它们都使用处理基本 CRUD 功能的通用服务 表单组件调
  • 将 ORB 特征与阈值进行匹配

    我的项目是基于android的草药识别 我使用 ORB 来获取关键点 特征并匹配特征 我想使用这个算法 我使用 4 个参考图像 并将它们的特征 image1 与 image1 1 2 1 3 1 4 2 3 3 4 进行匹配 然后我将到数据
  • SQL Server Express 4GB 限制

    简单问题 4GB 限制是针对每个数据库还是针对已安装的 SQL Server 实例 如您所知 您可以在 SQL Server 实例中创建多个数据库 每个数据库的大小限制为 4GB
  • 控制范围和预测范围

    我已经回顾了模型预测控制的参考书目和 Gekko 编程结构 尽管我了解它的编程方式及其目的 例如 我想了解 Gekko 如何根据 Seborg 中的相关内容来管理控制范围和预测范围之间的差异 我看不出代码有什么区别 下面是一个用于说明的 M
  • Socket_read() 说“不是有效的资源”

    我正在学习套接字编程并尝试使用 php 我想使用客户端连接到套接字服务器并从客户端读取服务器的响应 代码 服务器 php address 127 0 0 1 port 3343 echo I am here set time limit 0
  • 将枚举列表传递给条件

    我有域名 付款 class Payment String name PaymentType paymentType PaymentType 是一个 ENUM 搜索特定付款类型的所有付款很简单 def results Payment crea
  • 单成员结构的灵气属性传播问题

    我遇到了 Spirit Qi 的编译问题 它抱怨说值类型不是以下成员标识符 由于某种原因 Qi 的属性系统将标识符视为容器类型 并尝试枚举它的值类型 这是一个类似的问题这个问题 但是 我相信原因是单个成员结构和may与此有关bug incl
  • 如何为应用程序的容器使用相同的凭证处理程序配置来生成新的密码哈希值?

    我的 Web 应用程序的上下文定义类似于
  • php 文本中最常用的单词

    我在 stackoverflow 上找到了下面的代码 它可以很好地查找字符串中最常见的单词 但我可以排除对 a if you have 等 等常用词的计数吗 或者我必须在计数后删除元素吗 我该怎么做 提前致谢
  • Android BLE 血糖通知

    我厌倦了使用 Android BLE SDK 与我的 Glucose 设备进行通信 我需要 UUID 2a18 和 2a34 的 setCharacteristicNotification 我参考Android官方SDK如下 http de
  • 错误:[Dagger/MissingBinding] Map、Provider>

    我有 Dagger MissingBinding 的问题 我在 stackoverflow 上红色了所有相关答案 我尝试使用不同版本的 kotlin gradle dagger 我尝试使用不同的解决方法 例如kapt correctErro