[英]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.您必须创建一次组件,将其存储在某处(
object
, Application
),然后将其用于注入。 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.