如何使用 AndroidInjector 在模块中获取 MainActivity



有了dagger-android现在可以简单地编写以下内容并成功注入应用程序的依赖项:

@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
}
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
AndroidInjectionModule.class,
AppModule.class,
MainActivityModule.class
})
public interface ApplicationComponent {
void inject(BaseApplication baseApplication);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
ApplicationComponent build();
}
}
@Module
public abstract class AppModule {}
public class MainActivity extends AppCompatActivity implements 
HasSupportFragmentInjector {
@Inject
DispatchingAndroidInjector<Fragment> dispatchingAndroidInjector;
@Inject
Whatever whatever;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public AndroidInjector<Fragment> supportFragmentInjector() {
return dispatchingAndroidInjector;
}
}

public class BaseApplication extends Application implements 
HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
@Override
public void onCreate() {
DaggerApplicationComponent.builder()
.application(this)
.build()
.inject(this);
super.onCreate();
}
}
public class Whatever {
private final FragmentManager fragmentManager;
@Inject
Whatever(MainActivity mainActivity) {
this.fragmentManager = mainActivity.getSupportFragmentManager();
}
}

一个非常微不足道的例子。基本上将所有内容连接起来,以便能够在注入正确的片段管理器的情况下Whatever对象。这没关系并且有效。

但是,如果我想使用模块中的主活动怎么办?假设我想通过更改构造函数参数来实际Whatever显式向片段管理器公开依赖项:

@Inject
Whatever(FragmentManager fragmentManager) {...}

我现在需要提供这种依赖关系。怎么做呢?所以我尝试了以下方法:

@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
@Provides
static FragmentManager providesFragmentManager(MainActivity activity) {
return activity.getSupportFragmentManager();
}
}

现在dagger抱怨它找不到MainActivity@Providers.我认为@ContributesAndroidInjector方法将能够提供活动。我也有点困惑,在第一种情况下注入依赖项没有问题,但现在它无法做到这一点。

我也试图为此建立一个工厂,比如:

public FragmentManagerFactory {
private final FragmentManager fm;
@Inject
FragmentManagerFactory(MainActivity mainActivity){
this.fm = mainActivity.getSupportFragmentManager();
}
public FragmentManager get() {
return fm;
}
}
@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
@Provides
static FragmentManager providesFragmentManager(FragmentManagerFactory fragmentManagerFactory) {
return fragmentManagerFactory.get();
}
}

最终会出现相同的错误。

有没有人设法做到这一点??在它很容易之前,人们只需使用实例构建模块MainActivity将其存储在字段中并提供它。现在。。。一切都发生在幕后。

将不胜感激!

在我的设置中,我在ui/包的sub-di-packages根目录中有一个di/包。在ui/di包中,我声明了以下模块和组件:

@dagger.Module
public class MainActivityModule {
@Provides
FragmentManager provideFragmentManager(MainActivity mainActivity) {
return mainActivity.getSupportFragmentManager();
}
}

主活动子组件

@Subcomponent(modules = MainActivityModule.class)
public interface MainActivitySubcomponent  extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}

在我保存ApplicationComponent的顶级di包上,我还有一个额外的module

@Module(subcomponents = {MainActivitySubcomponent.class })
public abstract class BuildersModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity> mainActivityBinder(MainActivitySubcomponent.Builder builder);
}

正如你可以想象的那样BuildersModule,是ApplicationComponent@Component(modules = {的一部分。


免責聲明:我对 dagger2 相当陌生,我仍在尝试弄清楚很多东西。可能有更好的方法来实现您的需求。

最新更新