我对Daggers依赖注入还很陌生.我正在使用Dagger 2和Kotlin开发新的应用程序.我从一个用于构建的基础入门应用开始.在App.kt中,每个活动都是自动注入的,到现在为止还很酷.但是,现在实施Facebook和Google社交登录遇到了一个问题.
当应用尝试启动Facebook或Google的登录活动时,出现错误消息:
“没有为Class< external.activitIEs.classnameHere>绑定的注射器工厂”
我不能@ProvIDes这些外部类,因为它们没有实现@Module批注.
我的临时解决方案是在自动注入之前检查正在注入的活动,并跳过那些外部类.但是,这似乎有些奇怪,我想知道是否有更好的解决方案,或者是否缺少某些东西.我可以看到这个if语句随着时间的推移变得越来越长.
registeractivitylifecycleCallbacks(object : ActivitylifecycleCallbacks() { overrIDe fun onActivityCreated(p0: Activity?, p1: Bundle?) { p0?.let { if (p0 is FacebookActivity || p0 is CustomTabMainActivity || p0 is Customtabactivity ) { Log.d("KSulog", "App.kt is not injecting activity " + p0.toString()) } else { AndroIDInjection.inject(p0) } } } })}
谢谢参观.
解决方法:
做到这一点的方法很简单.
如果您查看Google样本,将会有一个明确的方向.像GitHubBrowserSample
因此,您将创建一个这样的接口Injectable,基本上是一个标记接口.
/** * Marks an activity / fragment injectable. */interface Injectable
每个活动或片段都会实现此接口,例如这样(在Kotlin中)
open class BaseActivity : AppCompatActivity(),Injectable {@Injectlateinit var viewmodelFactory: viewmodelProvIDer.Factorylateinit var baseActivityviewmodel: BaseActivityviewmodeloverrIDe fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) AndroIDInjection.inject(this) baseActivityviewmodel = viewmodelProvIDers.of(this, viewmodelFactory) .get(BaseActivityviewmodel::class.java)}
}
重要的几行是:
打开类BaseActivity:AppCompatActivity(),Injectable
AndroIDInjection.inject(this)
创建一个活动模块以贡献活动对象
/** * Module to contribute all the activitIEs. */@Moduleabstract class ActivityModule { @ContributesAndroIDInjector internal abstract fun contributeSplashActivity(): SplashActivity}
最后是DaggerInjector以启用注入
/** * Helper to inject all the activitIEs and fragments that are marked Injectable. */object DaggerInjector { fun injectAll(application: TurtleApp) { DaggerAppComponent.builder() .application(application) .build().inject(application) application .registeractivitylifecycleCallbacks(object : Application.ActivitylifecycleCallbacks { overrIDe fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { injectComponents(activity) } overrIDe fun onActivityStarted(activity: Activity) { } overrIDe fun onActivityResumed(activity: Activity) { } overrIDe fun onActivityPaused(activity: Activity) { } overrIDe fun onActivityStopped(activity: Activity) { } overrIDe fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { } overrIDe fun onActivityDestroyed(activity: Activity) { } }) } private fun injectComponents(activity: Activity) { if (activity is Injectable) { AndroIDInjection.inject(activity) }// (activity as? FragmentActivity)?.supportFragmentManager?.registerFragmentlifecycleCallbacks(// object : FragmentManager.FragmentlifecycleCallbacks() {// overrIDe fun onFragmentCreated(fm: FragmentManager?, f: Fragment?,// savedInstanceState: Bundle?) {// if (f is Injectable) {// AndroIDSupportInjection.inject(f)// }// }// }, true) }}
取消注释代码以启用片段注入.
总结以上是内存溢出为你收集整理的android-使用Dagger 2自动注入活动的问题全部内容,希望文章能够帮你解决android-使用Dagger 2自动注入活动的问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)