标签: dagger

多模块项目:如何设置 Dagger 来提供接口但隐藏特定于实现的依赖项?

在我的应用程序中,我有两个模块:apprepository
repository依赖于 Room,并且有一个GoalRepository接口:

interface GoalRepository
Run Code Online (Sandbox Code Playgroud)

和一个GoalRepositoryImpl内部类,因为我不想将它或 Room 依赖项暴露给其他模块

@Singleton
internal class GoalRepositoryImpl @Inject constructor(private val dao: GoalDao) : GoalRepository
Run Code Online (Sandbox Code Playgroud)

app取决于repository获取一个GoalRepository实例。目前,
我有一个:GoalRepositoryModule

@Module
class GoalRepositoryModule {
    @Provides
    @Singleton
    fun provideRepository(impl: GoalRepositoryImpl): GoalRepository = impl

    @Provides
    @Singleton
    internal fun provideGoalDao(appDatabase: AppDatabase): GoalDao = appDatabase.goalDao()

    @Provides
    @Singleton
    internal fun provideDatabase(context: Context): AppDatabase =
        Room.databaseBuilder(context, AppDatabase::class.java, "inprogress-db").build()
}
Run Code Online (Sandbox Code Playgroud)

问题是这不会编译(显然),因为公共provideRepository函数正在公开GoalRepositoryImpl,即一个internal类。
如何构建我的 Dagger …

android modularization dagger dagger-2 android-module

5
推荐指数
1
解决办法
2248
查看次数

错误:[Dagger/DuplicateBindings] com.example.StartRouter 被绑定多次?

我有课StartRouter。我想为每个活动提供此类的不同实例,并只要活动处于活动状态就保持活动状态(为此我所做的@ActivityScope)。

\n\n

问题是它在我的代码中没有这样做。看起来 dagger 为每个注释提供了一个实例,在我的例子中,一次为@ActivityScope. 该瞄准镜是定制的匕首瞄准镜。

\n\n

这是我的两个模块(每个活动一个),第一个模块:

\n\n
@Module\npublic class SplashModule {\n\n    @Provides\n    SplashVMFactory splashVMFactory(StartRouter startRouter){\n        return new SplashVMFactory(startRouter);\n\n\n    @Provides\n    StartRouter startRouter(){\n        return new StartRouter();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个模块:

\n\n
@Module\npublic class QuestionModule {\n\n    @Provides\n    QuestionVMFactory questionVMFactory(StartRouter startRouter){\n        return new QuestionVMFactory(startRouter);\n    }\n\n    @Provides\n    StartRouter startRouter(){\n        return new StartRouter();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有这个:

\n\n
@Module\npublic abstract class BinderModule {\n\n    @ActivityScope\n    @ContributesAndroidInjector(modules = SplashModule.class)\n    abstract SplashActivity bindSplashActivity();\n\n    @ActivityScope\n    @ContributesAndroidInjector(modules = QuestionModule.class)\n    abstract QuestionActivity bindQuestionActivity();\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的应用程序组件:

\n\n …

android dagger dagger-2

5
推荐指数
1
解决办法
8689
查看次数

Hilt:注入应用程序范围的存储库单例

我对 Dagger 比较陌生,刚刚开始使用 Hilt。我想要的是将应用程序范围的存储库(意味着它在任何地方都需要是相同的对象)注入到ViewModel. 该存储库将用于检索用户、身份验证令牌等。这是我能得到的最接近的:

@Module
@InstallIn(ApplicationComponent::class)
abstract class ApplicationModule {
    @Singleton
    @Binds
    abstract fun bindUserService(
        userRepository: UserRepository
    ): UserService

}

@Singleton
class UserRepository @Inject constructor(
) : UserService {
    private var _user: User? = null

    override fun getUser(): Observable<User> {
        return if (_user == null) {
            fetchUser()
        } else {
            Observable.just(_user)
        }
    }

    private fun fetchUser(): Observable<User> {
        return Observable.just(User("foo", Random.nextDouble(100.00)))
            .delay(2, TimeUnit.SECONDS)
            .doOnEach { _user = it.value }
    }
}

class ProfileViewModel @ViewModelInject constructor(
    private val …
Run Code Online (Sandbox Code Playgroud)

android viewmodel dagger dagger-hilt

5
推荐指数
1
解决办法
5758
查看次数

dagger2中@Provide和@Inject有什么区别?

@Inject 和 @Provide 有什么区别?

虽然两者都用于提供依赖项,但有什么区别?

android kotlin dagger dagger-2

5
推荐指数
1
解决办法
2135
查看次数

我收到“循环依赖”Android Dagger Hilt 错误

我从头开始检查了所有内容,但找不到错误。我找不到错误,可能是什么?

我收到以下编译错误;

HomeViewModel.java:6: error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this class because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
public final class HomeViewModel extends androidx.lifecycle.ViewModel {
             ^
Run Code Online (Sandbox Code Playgroud)

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.movielistandroid">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name="com.example.movielistandroid.Application"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MovieListAndroid">
        <activity android:name=".ui.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" />
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

应用程序.kt

package com.example.movielistandroid

import android.app.Application
import …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger dagger-2 dagger-hilt

5
推荐指数
1
解决办法
4051
查看次数

无法应用插件“dagger.hilt.android.plugin”

当我在项目中使用hilt时,我遇到了这个问题:

A problem occurred evaluating project ':app'.
    > Failed to apply plugin 'dagger.hilt.android.plugin'.
        > Could not create plugin of type 'HiltGradlePlugin'.
            > Could not generate a decorated class for type HiltGradlePlugin.
                > com/android/build/gradle/BaseExtension
Run Code Online (Sandbox Code Playgroud)
 Unable to load class 'com.android.build.gradle.BaseExtension'.
 This is an unexpected error. Please file a bug containing the idea.log file.
Run Code Online (Sandbox Code Playgroud)

主要问题是:无法应用插件“dagger.hilt.android.plugin”。

这是我的 build.gradle(模块)文件:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
    compileSdk 30

    defaultConfig {
        applicationId "net.holosen.hiltdaggerapp"
        minSdk 21
        targetSdk …
Run Code Online (Sandbox Code Playgroud)

android gradle dagger android-gradle-plugin dagger-hilt

5
推荐指数
1
解决办法
3042
查看次数

'“编译器选项 dagger.hilt.android.internal.projectType 不是可识别的 Hilt 选项” - 具有多模块项目的 Android Hilt

我有一个项目,最近我们将该项目转换为多模块。但是我无法运行该模块,它给了我这个错误。

我认为我的依赖项和一些配置出了问题。以下是我的app/build.gradle

plugins {
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.protobuf'
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
    id 'kotlin-android-extensions'

}
apply plugin: 'kotlin-android'


android {
    compileSdk 33

    defaultConfig {
        minSdk 26
        targetSdk 33
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    buildFeatures {
        viewBinding true
        dataBinding true
    }
    packagingOptions{
        pickFirst "androidsupportmultidexversion.txt"
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt' …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger kapt dagger-hilt

5
推荐指数
1
解决办法
7721
查看次数

匕首中的依赖性提供优先权

当您使用@Inject-annotated构造函数通知Dagger如何提供依赖项时,您可以稍后在模块中覆盖它吗?案例:我的生产代码使用带有带注释的构造函数的组件,我想在测试期间使用测试实现覆盖它.我的override = true模块会在测试期间成功覆盖生产实现吗?

或者更一般的问题,什么优先,模块或注释类?

dependency-injection dagger

4
推荐指数
1
解决办法
296
查看次数

Dagger:在提供的pojo上注入字段

目前使用dagger进行测试,我想要做的是实例化并注入不同的Bar实现.如何在提供的字段中注入字段?例如:

模块:

@Module(
        injects = {
                Main.class
        },
        complete = false,
        library = true
)
public class ExampleTestModule {
    @Provides
    public Foo providesFoo() {
        return new Foo();
    }
    @Provides
    public Bar providesBar(BarImpl impl) {
        // return new BarImpl(); // null
        return impl;
    }
}
Run Code Online (Sandbox Code Playgroud)

主要:

public class Main {
    @Inject
    Foo foo;
}
Run Code Online (Sandbox Code Playgroud)

富:

public class Foo {
    @Inject
    Bar bar;
}
Run Code Online (Sandbox Code Playgroud)

酒吧:

public interface Bar {

}
Run Code Online (Sandbox Code Playgroud)

BarImpl

public class BarImpl implements Bar {
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

public class ApplicationTest …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger

4
推荐指数
1
解决办法
2219
查看次数

Dagger-Android:缺少模块的setter

DataModule中:

@Module
class DataModule constructor(application: App){

    private var db : Database = Room.databaseBuilder(application.applicationContext,
            Database::class.java, "database.db")
            .build()

    @Provides
    @PerApplication
    fun provideDatabase(): Database {
        return db
    }
Run Code Online (Sandbox Code Playgroud)

应用程序:

class App : DaggerApplication() {

    @Inject lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        setupTimber()
       // setupCrashlytics()
        RxPaparazzo.register(this)
    }

    override fun applicationInjector(): AndroidInjector<out App> {
        return DaggerApplicationComponent.builder()
                .dataModule(DataModule(this)).create(this)
    }
Run Code Online (Sandbox Code Playgroud)

ApplicationComponent:

@PerApplication
@Component(modules = [AndroidSupportInjectionModule::class, ActivityBindingModule::class, ApplicationModule::class, DataModule::class, ServiceModule::class])
interface ApplicationComponent : AndroidInjector<App> {
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>()

}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error:(21, 2) …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection kotlin dagger dagger-2

4
推荐指数
1
解决办法
1806
查看次数