android-使用Dagger 2自动注入活动的问题

android-使用Dagger 2自动注入活动的问题,第1张

概述我对Daggers依赖注入还很陌生.我正在使用Dagger2和Kotlin开发新的应用程序.我从一个用于构建的基础入门应用开始.在App.kt中,每个活动都是自动注入的,到现在为止还很酷.但是,现在实施Facebook和Google社交登录遇到了一个问题.当应用尝试启动Facebook或Google的登录活动时,出现错

我对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自动注入活动的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1210093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存