Android 使用匕首2自动注入活动的问题
我还是个新手。我正在使用Dagger 2和Kotlin开发一个新的应用程序。我从一个基本的入门应用程序开始,这个应用程序是为了进一步发展。在App.kt中,每个活动都是自动注入的,这到目前为止还是很酷的。然而,我现在在实现Facebook和Google社交登录时遇到了一个问题 当应用程序尝试启动Facebook或Google登录活动时,我收到错误信息:Android 使用匕首2自动注入活动的问题,android,dependency-injection,kotlin,dagger-2,Android,Dependency Injection,Kotlin,Dagger 2,我还是个新手。我正在使用Dagger 2和Kotlin开发一个新的应用程序。我从一个基本的入门应用程序开始,这个应用程序是为了进一步发展。在App.kt中,每个活动都是自动注入的,这到目前为止还是很酷的。然而,我现在在实现Facebook和Google社交登录时遇到了一个问题 当应用程序尝试启动Facebook或Google登录活动时,我收到错误信息: “无类别的喷油器出厂限制” 我无法@Provides提供这些外部类,因为它们没有实现@Module注释 我的临时解决方案是在自动注入之前检查正在
“无类别的喷油器出厂限制”
我无法@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)
}
}
}
})
}
感谢您的关注。您应该能够像注入其他类一样注入这些类。提供Java中的示例。假设您有
AppComponent
和AppModule
类:
@Component(modules = AppModule.class)
public interface AppComponent {
....
void inject(App app);
....
}
@Module
public class AppModule {
@Provides
FacebookActivity providesFacebookActivity() {
return new FacebookActivity();
}
}
然后,您可以对要注入到主活动中的FacebookActivity进行注释
@Inject FacebookActivity mFacebookActivity;
因此,我的外部活动被注入到我的主活动中,而主活动又实现了
AndroidInjection.injection(这)
在AppComponent
中定义。该组件链接到AppModule
,该组件具有@为facebook活动提供的,,您的解决方案很好,但正如您所说,它的扩展性不好
您可以查看其中一个,他们在其中实现了HasSupportFragmentInjector
接口,以确定是否要注入活动
private fun handleActivity(activity: Activity) {
if (activity is HasSupportFragmentInjector) {
AndroidInjection.inject(activity)
}
if (activity is FragmentActivity) {
activity.supportFragmentManager
.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentCreated(
fm: FragmentManager,
f: Fragment,
savedInstanceState: Bundle?
) {
if (f is Injectable) {
AndroidSupportInjection.inject(f)
}
}
}, true
)
}
}
这样做的方法很简单。
如果你看看谷歌的样本,你会有一个明确的方向。像
因此,您将创建一个可注入的接口,基本上是一个标记接口
/**
* Marks an activity / fragment injectable.
*/
interface Injectable
每个活动或片段都将实现这个接口,例如(在Kotlin中)
}
重点是:
开放类BaseActivity:AppCompatActivity(),可注入
AndroidInjection.inject(this)
创建活动模块以贡献活动对象
/**
* Module to contribute all the activities.
*/
@Module
abstract 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)
}
}
取消对代码的注释以启用片段
注入。感谢您的详细解释。使用可注入接口作为标记很容易实现,并且似乎工作良好。
/**
* 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)
}
}