Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用kotlin生成包含@contributesandroid的模块?_Android_Kotlin_Dependency Injection_Dagger 2_Dagger - Fatal编程技术网

如何使用kotlin生成包含@contributesandroid的模块?

如何使用kotlin生成包含@contributesandroid的模块?,android,kotlin,dependency-injection,dagger-2,dagger,Android,Kotlin,Dependency Injection,Dagger 2,Dagger,我正在学习dagger 2,现在我在kotlin上使用dagger-2.25.4,我为dagger制作了一个基本应用程序类,如下所示: package com.example.demomvvm import com.example.demomvvm.dagger.DaggerAppComponent import dagger.android.AndroidInjector import dagger.android.support.DaggerApplication class MVVMA

我正在学习dagger 2,现在我在kotlin上使用dagger-2.25.4,我为dagger制作了一个基本应用程序类,如下所示:

package com.example.demomvvm

import com.example.demomvvm.dagger.DaggerAppComponent
import dagger.android.AndroidInjector
import dagger.android.support.DaggerApplication

class MVVMApplication: DaggerApplication() {

    override fun applicationInjector(): AndroidInjector<out DaggerApplication>? {
        return DaggerAppComponent.builder().application(this).build()
    }
}
这就是我在Dagger生成的代码中遇到的错误:

/home/suvodip/AndroidStudioProjects/demoMVVM/app/build/tmp/kapt3/stubs/debug/com/example/demomvvm/dagger/AppComponent.java:7: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.demomvvm.MVVMApplication> {
                ^
      java.lang.String is injected at
          com.example.demomvvm.ui.auth.LoginActivity.dagger
      com.example.demomvvm.ui.auth.LoginActivity is injected at
          dagger.android.AndroidInjector.inject(T) [com.example.demomvvm.dagger.AppComponent → com.example.demomvvm.dagger.ActivityBuilderModule_ContributeLoginActivity.LoginActivitySubcomponent]

@SuvodipMondal欢迎来到社区

您得到的错误是因为
@Binds
@ContributesAndroidInjector
方法必须是抽象的,因为它们没有方法体。这意味着它们必须在接口或抽象类上运行
@提供的
方法可能是静态的,这意味着它们可以在抽象类和Java-8编译接口上运行,但非静态(“实例”)
@提供的
方法不能在抽象类上运行。这在匕首常见问题解答中明确列出

为了实现这一点,您必须在抽象类中使用
@JvmStatic

你必须加上这个

@Module
companion object{
  @JvmStatic
  @Provides
  fun doSomething(): String = "This is a string"
}
那么你的课就会变成这样

package com.example.demomvvm.dagger

import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector

@Module
abstract class ActivityBuilderModule {

    @ContributesAndroidInjector
    abstract fun contributeLoginActivity(): LoginActivity

    @Module
    companion object{
     @JvmStatic
     @Provides
     fun doSomething(): String = "This is a string"
   }
}
更多参考,

package com.example.demomvvm.ui.auth

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import dagger.android.support.DaggerAppCompatActivity
import kotlinx.android.synthetic.main.activity_login.*
import javax.inject.Inject

class LoginActivity : DaggerAppCompatActivity(), AuthListener {

    @Inject
    lateinit var dagger: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("Dagger", "$dagger")

    }
}
@Module
companion object{
  @JvmStatic
  @Provides
  fun doSomething(): String = "This is a string"
}
package com.example.demomvvm.dagger

import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector

@Module
abstract class ActivityBuilderModule {

    @ContributesAndroidInjector
    abstract fun contributeLoginActivity(): LoginActivity

    @Module
    companion object{
     @JvmStatic
     @Provides
     fun doSomething(): String = "This is a string"
   }
}