有了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 相当陌生,我仍在尝试弄清楚很多东西。可能有更好的方法来实现您的需求。