在android中的activity中使用变量注入来注入接口

问题描述 投票:0回答:1

连接.kt

interface Connection {
    fun connect(endpoint:String)
}

HttpsConnection.kt

class HttpsConnection @Inject constructor(): Connection {

    override fun connect(endpoint: String) {
        PrintUtils.printLog("HttpsConnection made")
    }

}

HttpsConnectionModule.kt

@Module
@DisableInstallInCheck
class `HttpsConnectionModule` {

    @Provides
    fun provideHttpsConnection() : Connection {
        return HttpsConnection()
    }

}

ConnectionComponent.kt

@Component(modules = [HttpsConnectionModule::class])
interface ConnectionComponent {
    fun inject(activity: IntroScopeDemoActivity)
}

IntroScopeDemoActivity.kt

class IntroScopeDemoActivity : AppCompatActivity() {

    //@Inject lateinit var conn : HttpsConnection
    //@Inject lateinit var connInterface : Connection

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intro_scope_demo)

        val comp = DaggerConnectionComponent.builder().build()
        comp.inject(this@IntroScopeDemoActivity)

        println("Injection completed")

    }
}

发生了什么事

@Inject lateinit var conn : HttpsConnection

  • 如果我用上面的代码来注入实现,就可以了

  • 但是如果我使用下面的行来注入接口,它不起作用

@Inject lateinit var connInterface : Connection


错误:

/Users/devrath/Documents/Projects/Github/droid-di-use-cases/frameworks/hilt/code/app/build/tmp/kapt3/stubs/debug/com/istudio/di/modules/dagger/demos/scopes/introdemo/components/ConnectionComponent.java:9: error: [Dagger/MissingBinding] java.sql.Connection cannot be provided without an @Provides-annotated method.
public abstract interface ConnectionComponent {
                ^
      java.sql.Connection is injected at
          com.istudio.di.modules.dagger.demos.scopes.introdemo.IntroScopeDemoActivity.connInterface
      com.istudio.di.modules.dagger.demos.scopes.introdemo.IntroScopeDemoActivity is injected at
          com.istudio.di.modules.dagger.demos.scopes.introdemo.components.ConnectionComponent.inject(com.istudio.di.modules.dagger.demos.scopes.introdemo.IntroScopeDemoActivity)

问题

是否可以将接口注入变量中,因为接口具有定义的实现并作为模块附加在组件中?

android kotlin dependency-injection dagger-2
1个回答
0
投票
  1. 请在
    IntroScopeDemoActivity
    中检查进口情况。看起来
    @Inject lateinit var connInterface : Connection
    来自
    java.sql.Connection
    而不是您的
    Connection
    界面。
  2. 在这种情况下,您不需要
    @Provides
    ,您可以使用
    @Binds
    代替:
@Binds
fun bindHttpsConnection(impl: HttpsConnection): Connection

它的工作原理就像您已经将

HttpsConnection
添加到图表中一样(使用
@Inject constructor
),并且使用
@Binds
,您只需将实现“映射”到接口即可。

由于该方法只有签名而没有实现体,因此

HttpsConnectionModule
不能是常规类,但可以是接口。

© www.soinside.com 2019 - 2024. All rights reserved.