【发布时间】:2018-06-13 09:26:41
【问题描述】:
您好,我是 dagger 2 的新手,并尝试在下面的 MyActivity 类中注入 sharedPreference 的实例:
class MyApplication : Application() {
companion object {
@JvmStatic lateinit var applicationComponent : ApplicationComponent
}
override fun onCreate() {
super.onCreate()
applicationComponent = DaggerApplicationComponent.builder().androidModule(AndroidModule(this)).build()
}
}
这里是组件和模块
@Singleton
@Component(modules = arrayOf(AndroidModule::class))
interface ApplicationComponent {
fun inject(mainActivity: MainActivity)
}
@Module
class AndroidModule (private val application: Application){
@Provides
@Singleton
fun provideApplicationContext() : Context = application
@Provides
@Singleton
fun provideSharedPreference() : SharedPreferences = application.getSharedPreferences("shared pref", Context.MODE_PRIVATE)
}
class MainActivity: Activity{
@Inject
internal lateinit var sharedPreference: SharedPreferences
@Inject
internal lateinit var MainScreenPresenter: MainScreenContract.Presenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_Screen)
MyApplication.applicationComponent.inject(this)
sharedPreference.toString()
initiateViews()
}
}
我收到以下错误:
Error:(7, 1) error: android.content.SharedPreferences cannot be provided without an @Provides- or @Produces-annotated method.
【问题讨论】:
-
fun inject(any: Any)你必须是具体的。那是fun inject(app: MyApplication)。 -
如果我想注入其他 kotlin 类怎么办?我希望能够在项目中注入任何需要依赖注入的类
-
这不是 DI 的工作方式。从哲学上讲,这是关于做出有意识的决定。类似于“是的,我知道这个组件可以注入这个类”的东西。从技术上讲,组件需要一个要注入的类列表。这些类肯定会成为最终消费者,例如活动或应用程序,这是由 Android 为您创建的,您在创建后将其注入。除此之外,您将使用 @Inject 带注释的构造函数。遵循官方用户指南。
-
所以如果我创建了一个名为 Myclass 的类,我只需要编辑组件并添加 fun inject(myclass : Myclass )?
-
你只需要手动注入你自己不调用构造函数的类,比如Activity。如果您创建了一个名为
Myclass的类,您通常会使用构造函数注入来注入其字段。在这里阅读:google.github.io/dagger/users-guide 然后要获得一个实例,您需要 1)在 Activity 或 Application(或其他由 Android 实例化的类)中声明属性@Inject lateinit var myclass: MyClass,以便可以注入 2)再次使用构造函数注入。
标签: android dependency-injection kotlin dagger-2