标签: dagger

当项目包含多个 android 模块时,不会生成 dagger 测试组件

Android Studio 3.4
kotlin 1.3.0
dagger 2.21
Run Code Online (Sandbox Code Playgroud)

我有一个项目,有一个presentationdata模块。我正在尝试在数据模块中创建测试组件。我可以为演示模块生成组件。我正在使用 kotlin-kts 进行 gradle 构建。

对于演示模块,我有以下内容 build.gradle.kts

plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("kapt")
}

android {
    compileSdkVersion(Versions.compileSdkVersion)

    defaultConfig {
        applicationId = "nz.org.westforce.mobileui"
        minSdkVersion(Versions.minSdkVersion)
        targetSdkVersion(Versions.targetSdkVersion)
        versionCode = Versions.versionCode
        versionName = Versions.versionName

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation(Libraries.appCompat)
    implementation(Libraries.kotlinStdlib)
    implementation(Libraries.daggerAndroid)
    implementation(Libraries.daggerSupport)
    kapt(Libraries.daggerCompiler)
    kapt(Libraries.daggerProcessor)

    androidTestImplementation(TestLibraries.runner)
    androidTestImplementation(TestLibraries.espressoCore)

    testImplementation(TestLibraries.junit)
    testImplementation(Libraries.daggerAndroid)
    testImplementation(Libraries.daggerSupport)

    kaptTest(Libraries.daggerCompiler)
    kaptTest(Libraries.daggerProcessor)

    implementation(project(":data"))
}
Run Code Online (Sandbox Code Playgroud)

对于演示模块,我有以下应用程序:

class WestforceCreditUnionMobileuiApplication
    : Application(), HasActivityInjector { …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

3
推荐指数
1
解决办法
1343
查看次数

如何使用一个 ViewModelFactory 为 ViewModel 提供 Dagger

如何实现一个ViewModelFactory来提供我的项目ViewModels及其对整个项目的依赖?

java android viewmodel kotlin dagger

3
推荐指数
1
解决办法
2978
查看次数

org.jetbrains.kotlin.resolve.lazy.NoDescriptorForDeclarationException:未找到声明脚本的描述符

尝试添加匕首后我无法构建项目

我刚开始使用 kotlin 我使用了一个示例 Dagger 2 项目在某个时候我的项目停止启动

尝试的解决方案:

Invalidate Caches/Restart Build -> Clean Project 更新 kotlin 插件,使用最新版本的 kotlin

构建:gradle(模块:应用程序)

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

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    kotlinOptions {
        jvmTarget = '1.8'

    }

    dataBinding {
        enabled = …
Run Code Online (Sandbox Code Playgroud)

android build kotlin dagger

3
推荐指数
1
解决办法
773
查看次数

使用 Dagger 注入接口的所有实现

我有一个接口BaseProcessor和它的几个实现。

现在,在一个类 ( ValidationComponent) 中,我想要一个包含所有 BaseProcessor 实现的列表,如下所示:List<BaseProcessor> processors;

所有的实现都有一个@Inject构造函数。

现在,目前我正在这样做:在ValidationComponent课堂上,

    private List<BaseProcessor> processors;

    @Inject
    public ValidationComponent(@NonNull final ProcessorImpl1 processor1,
                               @NonNull final ProcessorImpl2 processor2,
                               @NonNull final ProcessorImpl3 processor3) {
        this.processors = new ArrayList<>();
        this.processors.add(processor1);
        this.processors.add(processor2);
        this.processors.add(processor3);
    }
Run Code Online (Sandbox Code Playgroud)

为了将实现传递给构造函数,dagger 正在创建这些实现的实例,因为如前所述,它们都有@Inject构造函数。

现在,不是在构造函数中传递每个具体实现,我可以以某种方式使用 Dagger 为我创建所有这些实现实例吗?

我知道在 Spring 框架中可以通过使用@Componentspring 注释来注释实现。Dagger 中有办法吗?

java dependency-injection dagger dagger-2

3
推荐指数
1
解决办法
486
查看次数

Android Dagger Hilt:我们是否需要 ViewModel 的范围注释?

在我的应用程序中,我有一个需要访问 ViewModel 的 MainActivity。我正在使用 DaggerHilt 和 @ViewModelInject 注释注入 ViewModel。此外,我在 Activity 中有两个 Fragment,它们需要访问同一个 ViewModel,以便使用 observable 相互传递数据。

问题:我发现每当我的一个 Fragment 通过onDestroy()它的 ViewModel 时就会被杀死。这让我认为 Activity 和 Fragment 没有共享同一个 ViewModel。

我的问题:有谁知道我们是否应该在 Dagger Hilt 中为 ViewModel 使用范围注释?我在 Hilt 文档或 android 开发教程/指南中没有看到这一点。我曾假设他们正在制作 ViewModels 应用程序级别的单例,这是有道理的。

如果我们必须为 ViewModel 使用范围注释,有没有人知道哪个级别合适?

这是我的视图模型代码:

class MainActivityViewModel @ViewModelInject constructor(
    private val repo: Repo,
    private val rxSharedPrefsRepo: RxSharedPrefsRepo,
    private val resourcesRepo: ResourcesRepo,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
Run Code Online (Sandbox Code Playgroud)

android dagger android-viewmodel dagger-hilt

3
推荐指数
1
解决办法
2711
查看次数

@InstallIn 只能用于 @Module 或 @EntryPoint 类

我是 Android 依赖注入的新手。我正在使用 Dagger-Hilt,并且在我为 DB 提供程序生成的 AppModule 类中出现错误并且项目无法编译。

错误是@InstallIn can only be used on @Module or @EntryPoint classes 这是我的 AppModule 对象。我哪里出错了?

@Module
@InstallIn(ApplicationComponent::class)
object AppModule {

@Singleton
@Provides
fun provideAppDatabase(
    @ApplicationContext app: Context
) = Room.databaseBuilder(
    app,
    AppDatabase::class.java,
    "gelirkenal"
).build()

@Singleton
@Provides
fun provideItemDao(db: AppDatabase) = db.itemDao()
}
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger dagger-hilt

3
推荐指数
4
解决办法
1500
查看次数

Singleton 类应该使用什么?来自 Dagger 的真正的 Singleton 或 @Singleton 注释?

我正在学习使用 Hilt 和 Dagger 进行依赖注入,我想知道...当使用 Singleton 模式创建类时,我应该使用真正的 Singleton 还是 Hilt 注释?我在互联网上搜索,但找不到显示差异的结论性解决方案,而且当我单击从 Hilt 打开生成的文件时,它看起来不像单例,它是“threadissuesproof”吗?

“真正的单例”,像这样:

class SongController private constructor() {
companion object {
    @Volatile
    private var INSTANCE: SongController? = null

    fun getInstance(): SongController {
        synchronized(this) {
            var instance = INSTANCE
            if (instance == null) {
                instance = SongController()
                INSTANCE = instance
            }
            return instance
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

或者 Hilt 的 @Singleton 注释?

@Singleton
class SongController @Inject constructor() {}
Run Code Online (Sandbox Code Playgroud)

使用注释有什么好处吗?最好、最安全的选择仍然是 getInstace() ->synchronized() 块?

在这种情况下我应该使用哪一个?

我不明白的最重要的问题是,注释的行为方式是否相同?

android kotlin dagger dagger-hilt

3
推荐指数
1
解决办法
500
查看次数

是否可以在Dagger和CDI之间共享通用的JSR 330代码?

我是Agorava的技术主管,Agorava是一个帮助消费社交网络数据的框架.

今天,Agorava基于CDI构建,以简化其在Java EE堆栈中的使用,但我们希望为Dagger提供一个实现,以便为Android提供更轻松的解决方案.

我的问题是:我们可以在CDI和Dagger实现之间共享通用的JSR 330兼容代码吗?换句话说,是否有可能与匕首在罐子轴承JSR 330注释已经编译代码和源代码延伸或在一个特定匕首罐使用此代码(与@Provides,@Modules和其他匕首特定项目)?

如果答案是否,是否有任何问题用Dagger编译器编译我的常见JSR 330 jar并在我的CDI实现中使用它?更准确地说@Inject,限定符和其他JSR 330细节仍然可以在运行时使用,带有这些注释代码的类是否仍然不受Dagger编译器的影响?最后是否有一种关于Dagger生成的代码(类名,注释)的跟踪器,以允许CDI检测它并忽略它?

java jsr330 cdi dagger

2
推荐指数
1
解决办法
652
查看次数

如何在具有2种不同实现的匕首模块中提供单例

想象一下匕首module有以下两种方法来提供一个物体.

@Provides @Singleton Cache<Settings> providesSettingsCache( Database db )
{
    return new StateCache( db, BuildConfig.VERSION_CODE );
}

@Provides @Singleton Cache<User> providesUserCache( Database db )
{
    return new StateCache( db, BuildConfig.VERSION_CODE );
}
Run Code Online (Sandbox Code Playgroud)

在我的示例中StateCache实现了Cache<User>Cache<Settings>接口.现在不是两个方法都返回一个实例StateCache,我希望这两个方法显然都指向同一个实例.怎么能在Dagger得到这个?是否module保持引用的一个实例StateCache,并且两个方法都返回?

android dependency-injection dagger dagger-2

2
推荐指数
1
解决办法
943
查看次数

无法在Java和Kotlin混合项目上注入Dagger2

我有一个主要用Java编写的项目,但是我正在慢慢转移到Kotlin从事新活动。该项目应用了Dagger2,并且与基于Java的活动一起使用时,可以完美地工作。但是,当我创建Kotlin活动并尝试注入时,出现以下错误。

LoginIDPresenter没有@Inject构造函数或通过@Provides-或-带@Produces注释的方法不能提供。此类型支持成员注入,但不能隐式提供。

   void inject(LoginIDActivity loginIDActivity);

     com.maxis.mymaxis.ui.logindigitalid.LoginIDPresenter is injected at
         com.maxis.mymaxis.ui.logindigitalid.LoginIDActivity.loginIDPresenter
     com.maxis.mymaxis.ui.logindigitalid.LoginIDActivity is injected at
         com.maxis.mymaxis.injection.component.ActivityComponent.inject(loginIDActivity)
Run Code Online (Sandbox Code Playgroud)

再次重申一下,当我在Java活动中进行注入时,它可以完美地工作。另外,我的Module和Component文件全部使用Java。仅当我创建Kotlin活动并尝试在其中进行注入时,我才会收到错误。

LoginIDPresenter.kt

class LoginIDPresenter : BasePresenter<LoginIDMvpView>() {

    lateinit var mContext : Context

    @Inject
    fun LoginIDPresenter(@ActivityContext context: Context){
        mContext = context
    }

    override fun attachView(loginIDMvpView: LoginIDMvpView) {
        super.attachView(loginIDMvpView)
    }

    override fun detachView() {
        super.detachView()
        mCompositeSubscription.clear()
    }
}
Run Code Online (Sandbox Code Playgroud)

LoginIDActivity.kt

class LoginIDActivity : BaseActivity(), LoginIDMvpView {

    @Inject lateinit var loginIDPresenter : LoginIDPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        loginIDPresenter.attachView(this)
    }

    override …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection kotlin dagger dagger-2

2
推荐指数
1
解决办法
911
查看次数