作者:卓菘碧625 | 来源:互联网 | 2023-01-28 00:04
随着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 dispatchingAndroidInjector;
@Inject
Whatever whatever;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public AndroidInjector supportFragmentInjector() {
return dispatchingAndroidInjector;
}
}
public class BaseApplication extends Application implements
HasActivityInjector {
@Inject
DispatchingAndroidInjector dispatchingAndroidInjector;
@Override
public AndroidInjector 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();
}
}
现在匕首抱怨说,它无法找到@Providers
的MainActivity
.我认为该@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
需要在一个字段中使用它的实例构建模块并提供它.现在......一切都发生在窗帘后面.
非常感谢一些帮助!
1> Blackbelt..:
在我的设置我有一个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 {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder {
}
}
在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 = {
的ApplicationComponent
.
免责声明:
我是dagger2的新手,我仍然试图找出很多东西.可能有更好的方法来实现您的需求.
对不起,我的错误.我保留了``MainActivityModule``摘要.非常感谢!