已解决
我是 Dagger 2 的新手,我正在尝试为类提供 Activity Context 但没有成功。我搜索了很多但没有找到任何合适的答案。
我可以提供应用程序上下文。但我也需要提供 Activity Context,但我不知道有什么好方法可以实现它。
我需要澄清一下,我正在使用 Dagger 作为 Android 依赖项。
def dagger_version = "2.24"
implementation "com.google.dagger:dagger:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
我也只有一个具有以下代码的 AppComponent:
@Singleton
@Component(
modules = {
AndroidSupportInjectionModule.class,
ActivityBuildersModule.class,
AppModule.class,
ViewModelFactoryModule.class,
}
)
public interface AppComponent extends AndroidInjector<BaseApplication> {
SessionManager sessionManager();
@Component.Builder
interface Builder{
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
除了我的每个 Activity 都有一个模块,但我没有找到为 AppComponent 或从 ActivityModule 注入(inject) Activity 上下文的方法。
正确的做法是什么?
更新
我终于找到了正确的方法。
首先我为我想提供的类创建了一个模块
@Module
public class AlertsModule {
@Provides
static Alerts provideAlerts(Activity activity){
return new Alerts(activity);
}
}
然后我转到我想要注入(inject)该自定义类的 ActivityModules 并执行类似的绑定(bind)
@Module
public abstract class MainActivityModule {
...
@Binds
abstract Activity providesActivity(MainActivity activity);
...
}
最后,我将 CustomClassModule 包含在我的 ActivityBuildersModule 中,我在其中使用 @ContributesAndroidInjector 来提供我的 Activity 。
@MainScope
@ContributesAndroidInjector(
modules = {
AlertsModule.class,
}
)
abstract MainActivity contributeMainActivity();
最佳答案
您可以使用与当前绑定(bind) Application
实例相同的方式绑定(bind) Activity
实例,方法是使用 @Component.Builder
或 @Component.Factory
.
一个示例实现看起来像这样:
@Subcomponent(...)
interface ActivitySubcomponent {
@Subcomponent.Factory
interface Factory {
ActivitySubcomponent create(@BindsInstance MyActivity activity)
}
}
@Module(subcomponents = [ActivitySubcomponent.class])
class ApplicationModule {
....
}
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
...
((MyApplication) getApplication())
.applicationComponent
.activitySubcomponentFactory()
.create(this)
.inject(this)
}
}
关于java - 无法使用 Dagger 2 提供 Activity Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58375566/