匕首2 Android活动之间的单例



我想了解@Singleton如何在Dagger 2上工作

build.gradle

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

Vehicle.kt

@Singleton
class Vehicle @Inject constructor() {
var speed = 0
}

AppComponent.kt

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

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

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}")
}
}

我希望看到车辆速度75在SecondActivity,但它是0。

我相信一定是我错过了什么或误解了什么,只是我不明白。

问题是基于您正在创建DaggerAppComponent的多个实例这一事实。您必须创建一个组件一次,将其存储在某处(object,Application),然后将其用于注入。组件的每个实例代表一个完整的、独立的依赖关系图。

像这样的东西应该像预期的那样工作:

@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}")
}
}

最新更新