- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用 dagger-android
现在可以简单地编写以下内容并成功注入(inject)应用程序的依赖项:
@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();
}
}
一个非常简单的例子。基本上连接所有东西,以便能够通过注入(inject)正确的 fragment 管理器来获取对象 Whatever
。这没问题并且有效。
但是,如果我想在模块中使用主 Activity 怎么办?假设我实际上想通过更改构造函数参数来使 Whatever
显式地将依赖项暴露给 fragment 管理器:
@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
方法能够提供 Activity 。我也有点疑惑,第一种情况下注入(inject)依赖没有问题,但现在却做不到。
我也试过为此建立一个工厂,比如:
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();
}
}
MainActivitySubcomponent
@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
是 @Component(modules = {
of ApplicationComponent
的一部分。
免责声明:<子><上>我是 dagger2 的新手,我仍在尝试弄清楚很多东西。可能有更好的方法来实现您的需求。
关于android - 如何使用 AndroidInjector 在模块中获取 MainActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353539/
我想要关注 应用组件 subcomponentBlue(modules=ModuleX.class) subcomponentRed (modules=ModuleY.class) 假设我有四个 Ac
使用 AndroidInjector 和 Subcomponents 无法将作用域对象的事件注入(inject) Espresso 的 Test 类。 以前使用应用程序级组件和事件组件,只要您创建一个
使用 dagger-android 现在可以简单地编写以下内容并成功注入(inject)应用程序的依赖项: @Module public abstract class MainActivityModu
我有一个示例项目,我在其中使用 dagger-android AndroidInjector 来注入(inject)依赖项。在此示例应用程序中,我有一个 Navigator 类,它执行所有 Activ
我正在使用 dagger 2 并尝试将我的 Android 项目从 Java 转换为 Kotlin。成功构建后出现运行时错误: MyFragmentSubcomponentBuilder 没有实现 A
我已经使用 Android Injector 之前的 Dagger 风格有一段时间了,现在决定尝试新的方法。到现在为止,我基本上是这样声明 AppComponent 的: @Singleton @Co
我有以下问题:我开始研究 Dagger 2 并尝试向我的 App 类添加注入(inject)。这是我的 App 类的代码: class TraktTvApp : Application(), HasA
我刚刚根据 documentation 实现了 dagger.android .那里写的第一个不正确的地方是 HasActivityInjector 的存在,它很容易被替换为 HasDispatchi
我在尝试从 Dagger v2.11 中获取新的 Android dagger 类时遇到错误,该类在我们的项目中运行。我不确定问题出在哪里,因为我已经考虑了 https://google.github
我想制作一个包含一个主要 Activity 和多个 fragment 的简单项目。在这里,我在一项 Activity 中有两个 fragment ,我想将演示者注入(inject)登录 fragmen
你好我是 Dagger 新手。我正在尝试学习,但在生成 AppComponent 类时遇到问题。这是我的 AppComponent 类代码。我在 stackoverflow 中搜索了一些答案,但没有一
我是一名优秀的程序员,十分优秀!