我试图向 MainActivity 注入 AlertDialog
class MainActivity : BaseActivity() {
@Inject
val alertStore:AlertStore; //propery must be initialized or abstract Error
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
为 AppComponent.kt
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class
]
)
@Singleton
interface AppComponent : AndroidInjector<App> {
@Component.Builder
interface Builder {
fun addContext(@BindsInstance context: Context): Builder
fun build(): AppComponent
}
}
AppModule.kt
@Module
class AppModule {
@Singleton
@Provides
fun provideAlertStore(context: Context) : AlertStore = AlertStore(context)
}
App.kt
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().addContext(this).build()
}
}
我是匕首的新手。所以,请忍受我。我认为我缺少背景信息。建议我,请解释一下,所以我也理解这个概念
我是否还必须注入MainActivity以获得Alert或我的上下文丢失。
生成的在构建文件夹下的文件
@kotlin.Metadata(mv = {1, 1, 15}, bv = {1, 0, 3}, k = 1, d1 = {"\u0000&\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0012\u0010\t\u001a\u00020\n2\b\u0010\u000b\u001a\u0004\u0018\u00010\fH\u0014R\u0016\u0010\u0003\u001a\u00020\u00048\u0006X\u0087\u0004\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006R\u000e\u0010\u0007\u001a\u00020\bX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\r"}, d2 = {"Lcom/example/myapplication/MainActivity;", "Lcom/example/myapplication/common/BaseActivity;", "()V", "alertStore", "Lcom/example/myapplication/common/AlertStore;", "getAlertStore", "()Lcom/example/myapplication/common/AlertStore;", "viewModel", "Lcom/example/myapplication/home/MainViewModel;", "onCreate", "", "savedInstanceState", "Landroid/os/Bundle;", "app_debug"})
public final class MainActivity extends com.example.myapplication.common.BaseActivity {
@org.jetbrains.annotations.NotNull()
@javax.inject.Inject()
private final com.example.myapplication.common.AlertStore alertStore = null;
private com.example.myapplication.home.MainViewModel viewModel;
private java.util.HashMap _$_findViewCache;
@org.jetbrains.annotations.NotNull()
public final com.example.myapplication.common.AlertStore getAlertStore() {
return null;
}
@java.lang.Override()
protected void onCreate(@org.jetbrains.annotations.Nullable()
android.os.Bundle savedInstanceState) {
}
public MainActivity() {
super();
}
}
Alexey建议后进行编辑
更新我的变量后
@Inject lateinit var alertStore: AlertStore
错误消失了,但在运行以下应用程序时发生了错误
方法抛出'kotlin.UninitializedPropertyAccessException'异常。
答案 0 :(得分:0)
您的问题与 Dagger 没有直接关系,而是与 Kotlin 相关。
如果您使用val
属性,则需要使用一个值对其进行初始化。否则,它将在合同声明其为非空时被未初始化。抽象属性显然不起作用,因此您可能需要以不同的方式声明您的属性,并使用setter进行注入。
@set:Inject internal lateinit var alertStore: AlertStore