简体   繁体   English

匕首 2 Singleton 之间 Android 活动

[英]Dagger 2 Singleton between Android Activities

I am trying to understand how @Singleton works on Dagger 2我试图了解@Singleton 如何在 Dagger 2 上工作

build.gradle build.gradle

implementation 'com.google.dagger:dagger:2.32'
kapt 'com.google.dagger:dagger-compiler:2.32'

Vehicle.kt车辆.kt

@Singleton
class Vehicle @Inject constructor() {

    var speed = 0
}

AppComponent.kt应用组件.kt

@Singleton
@Component
interface AppComponent {

    fun inject(activity: MainActivity)

    fun inject(activity: SecondActivity)
}

MainActivity.kt MainActivity.kt

class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var mVehicle: Vehicle

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

        DaggerAppComponent.create().inject(this)

        mVehicle.speed = 75
    }
}

SecondActivity.kt第二活动.kt

class SecondActivity : AppCompatActivity() {

    @Inject
    lateinit var mVehicle: Vehicle

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

        DaggerAppComponent.create().inject(this)

        Log.d(TAG, "Vehicle speed: ${mVehicle.speed}")
    }
}

I expect to see the Vehicle speed 75 on SecondActivity, but it is 0. I am sure there must be something I am missing or misunderstand, just cannot figure it out.我希望在 SecondActivity 上看到车辆速度 75,但它是 0。我确信一定有我遗漏或误解的东西,只是无法弄清楚。

The problem is based on the fact you're creating multiple instances of DaggerAppComponent .问题是基于您正在创建DaggerAppComponent的多个实例的事实。 You have to create a component once, store it somewhere ( object , Application ), and then use it for injection.您必须创建一次组件,将其存储在某处( objectApplication ),然后将其用于注入。 Every instance of the component represents a complete, independent dependency graph.组件的每个实例都代表一个完整的、独立的依赖图。

Something like this should work as expected:这样的事情应该按预期工作:

@Singleton
@Component
interface AppComponent {
    fun inject(activity: FirstActivity)
    fun inject(activity: SecondActivity)
}

object ComponentHolder {
    val component: AppComponent by lazy { DaggerAppComponent.create() }
}

class FirstActivity : AppCompatActivity() {

    @Inject lateinit var mVehicle: Vehicle

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ComponentHolder.component.inject(this)

        mVehicle.speed = 75
    }
}

class SecondActivity : AppCompatActivity() {

    @Inject lateinit var mVehicle: Vehicle

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ComponentHolder.component.inject(this)
        
        Log.d("SecondActivity", "Vehicle speed: ${mVehicle.speed}")
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM