使用webserver
现在可以简单地编写以下内容并成功注入应用程序的依赖项:
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) {...}
现在dagger抱怨它找不到@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
@Provides
static FragmentManager providesFragmentManager(MainActivity activity) {
return activity.getSupportFragmentManager();
}
}
的{{1}}。我认为@Providers
方法可以提供活动。我对在第一种情况下如何注入依赖项没有问题感到有些疑惑,但现在它无法做到。
我也尝试为此建立工厂,例如:
MainActivity
最终会出现同样的错误。
有没有人设法做到这一点?在它变得非常简单之前,只需构建模块,并将@ContributesAndroidInjector
实例存储在一个字段中并提供它。现在......一切都发生在窗帘后面。
非常感谢一些帮助!
答案 0 :(得分:7)
在我的设置中,我的di/
包中的sub-di-packages
根目录中有ui/
个包。在ui/di
包中,我已经声明了以下模块和组件:
@dagger.Module
public class MainActivityModule {
@Provides
FragmentManager provideFragmentManager(MainActivity mainActivity) {
return mainActivity.getSupportFragmentManager();
}
}
MainActivitySubcomponent
@Subcomponent(modules = MainActivityModule.class)
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}
在我保留di
的顶级ApplicationComponent
包中,我还有module
@Module(subcomponents = {MainActivitySubcomponent.class })
public abstract class BuildersModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity> mainActivityBinder(MainActivitySubcomponent.Builder builder);
}
正如您可以想象的那样BuildersModule
是@Component(modules = {
的{{1}}的一部分。
声明: <子> 我是dagger2的新手,我仍然试图弄清楚很多东西。可能有更好的方法来实现您的需求。 功能 子>