gpt4 book ai didi

android - 如何在Android中使用Dagger2更轻松地注入(inject)Activity对象?

转载 作者:行者123 更新时间:2023-11-29 18:45:49 25 4
gpt4 key购买 nike

在 Android 上,当使用 Dagger2 时,我必须在使用 apiService 的每个 Activity 上调用以下行:

@Inject
public ApiService apiService;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

DaggerApiComponent.builder()
.activityModule(new ActivityModule(this))
.build()
.inject(this);

//...
}

我怎样才能将它概括为:

DaggerApiComponent.builder()
.activity(this)
.build()
.inject(this);

或者更简单的是:

MyApplication.injectApiService(this);

我应该如何更改我的组件和模块以在我的 Activity 中使用 Dagger2 并减少复制粘贴代码?

这是我的ApiComponent:

@Singleton
@Component(modules = ApiModule.class)
public interface ApiComponent {

void inject(MainActivity activity);
void inject(...
}

这是ApiModule:

@Module(includes = {RetrofitModule.class, ActivityModule.class})
public class ApiModule {

@Singleton
@Provides
public static ApiService provideApiService(Activity activity) {
//...
}
}

ActivityModule:

@Module
public class ActivityModule {

private final Activity context;

public ActivityModule(Activity context) {
this.context = context;
}

@Singleton
@Provides
public Activity provideActivityContext() {
return context;
}
}

最佳答案

这种“DI”的方法有两个问题:

  • 就像 OP 所说的那样:我们需要在需要注入(inject)的地方复制并粘贴此样板,这既乏味又难以重构。
  • Injectee(例如 Activity)不应该知道 @Inject 实例来自哪里,它关心的只是“嘿,给我一个它的实例”。

为了解决上述问题,dagger.android 来拯救。

  1. 为每个组件创建 AndroidInjector
// App component
@Singleton
@Component(
modules = [
AndroidSupportInjectionModule::class, // build-in module
ActivityBindingModule::class,
AppModule::class
]
)
interface AppComponent : AndroidInjector<MainApplication> {
// we need to bind `MainApplication` instance to this component,
// so we have a builder here.
@Component.Builder
abstract class Builder : AndroidInjector.Builder<MainApplication>()
}
// Each controller (e.g. `Activity` / `Fragment` / `Service`) subcomponents
@Module
abstract class ActivityBindingModule {
// will generate a FooActivitySubcomponent under ActivityBindingModule's component
@ActivityScoped
@ContributesAndroidInjector(modules = [FooModule::class])
internal abstract fun fooActivity(): FooActivity

@ActivityScoped
@ContributesAndroidInjector(modules = [BarModule::class])
internal abstract fun barActivity(): BarActivity
}
  1. 连接您的 AndroidInjector,以便它可以使用第 1 步中提供的注入(inject)器为我们进行注入(inject)。
// App component
class MainApplication : DaggerApplication() {

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().create(this)
}
}
// Each controller subcomponents
class FooActivity : DaggerAppCompatActivity() {
@Inject lateinit var foo: Foo

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// no need to call inject() here anymore!
foo.doSth()
}
}

有关具体示例:查看 iosched

关于android - 如何在Android中使用Dagger2更轻松地注入(inject)Activity对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52011331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com