android dagger2在fragment中怎么用
2022-04-19 52
在component中inject fragment就好
AppComponent通常提供全局的对象以便于其他的组件依赖使用,比如context,rest api接口等,这些都是全局的单例对象
MainActivityComponent特意针对MainActivity,所以它只提供其对应的MainActivityPresenter,因为其依赖AppComponent,所以它可以使用AppComponent提供的对象
这里使用http://blog.csdn.net/tiankong1206/article/details/46486401 这里的一个例子,主要把其中的一些细节稍微说的详细点,下面这一段说明来自网上:
@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。
1、首先是Module
[java] view plain copy print?
@Module
public class MainActivityModule {
private MainActivity mainActivity;
public MainActivityModule(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
@ActivityScope
MainActivity provideMainActivity() {
return mainActivity;
}
@Provides
@ActivityScope
MainActivityPresenter provideMainActivityPresenter(MainActivity mainActivity, User user) {
return new MainActivityPresenter(mainActivity, user);
}
}
注意里面的provide方法,我们后面还可以看到,这里的语法是@Module @Providers
然后是Component
[java] view plain copy print?
@ActivityScope
@Component(modules = {MainActivityModule.class , AppServiceModule.class})
public interface MainActivityComponent {
MainActivity inject(MainActivity mainActivity);
}
这里的MainActivityComponent包含两个Module,一个是我们上面列出来的MainActivityModule,另一个是AppServiceModule
接下来就是使用了,在MainActivity中:
[java] view plain copy print?
@Override
protected void setupActivityComponent() {
DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.appServiceModule(new AppServiceModule())
.build()
.inject(this);
}
这里在build之前把Component用到的每一个Module的构造函数初始化一下,在build之后inject注入,我们看一下这个自动生成的DaggerMainActivityComponent
[java] view plain copy print?
package com.example.lwp.mvp.ui.activity.component;
import com.example.lwp.mvp.data.AppServiceModule;
import com.example.lwp.mvp.data.AppServiceModule_ProvideUserFactory;
import com.example.lwp.mvp.model.User;
import com.example.lwp.mvp.ui.activity.MainActivity;
import com.example.lwp.mvp.ui.activity.MainActivity_MembersInjector;
import com.example.lwp.mvp.ui.activity.module.MainActivityModule;
import com.example.lwp.mvp.ui.activity.module.MainActivityModule_ProvideMainActivityFactory;
import com.example.lwp.mvp.ui.activity.module.MainActivityModule_ProvideMainActivityPresenterFactory;
import com.example.lwp.mvp.ui.activity.presenter.MainActivityPresenter;
import dagger.MembersInjector;
import dagger.internal.MembersInjectors;
import dagger.internal.ScopedProvider;
import javax.annotation.Generated;
import javax.inject.Provider;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerMainActivityComponent implements MainActivityComponent {
private Provider<MainActivity> provideMainActivityProvider;
private Provider<User> provideUserProvider;
private Provider<MainActivityPresenter> provideMainActivityPresenterProvider;
private MembersInjector<MainActivity> mainActivityMembersInjector;
private DaggerMainActivityComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
private void initialize(final Builder builder) {
this.provideMainActivityProvider = ScopedProvider.create(MainActivityModule_ProvideMainActivityFactory.create(builder.mainActivityModule));
this.provideUserProvider = AppServiceModule_ProvideUserFactory.create(builder.appServiceModule);
this.provideMainActivityPresenterProvider = ScopedProvider.create(MainActivityModule_ProvideMainActivityPresenterFactory.create(builder.mainActivityModule, provideMainActivityProvider, provideUserProvider));
this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), provideMainActivityPresenterProvider);
}
@Override
public MainActivity inject(MainActivity mainActivity) {
mainActivityMembersInjector.injectMembers(mainActivity);
return mainActivity;
}
public static final class Builder {
private MainActivityModule mainActivityModule;
private AppServiceModule appServiceModule;
private Builder() {
}
public MainActivityComponent build() {
if (mainActivityModule == null) {
throw new IllegalStateException("mainActivityModule must be set");
}
if (appServiceModule == null) {
this.appServiceModule = new AppServiceModule();
}
return new DaggerMainActivityComponent(this);
}
public Builder mainActivityModule(MainActivityModule mainActivityModule) {
if (mainActivityModule == null) {
throw new NullPointerException("mainActivityModule");
}
this.mainActivityModule = mainActivityModule;
return this;
}
public Builder appServiceModule(AppServiceModule appServiceModule) {
if (appServiceModule == null) {
throw new NullPointerException("appServiceModule");
}
this.appServiceModule = appServiceModule;
return this;
}
}
}
这里面有两个类,一个是DaggerMainActivityComponent,另一个是Build类,Build中就是几个模块的初始化以及build方法构建DaggerMainActivityComponent类并初始化。DaggerMainActivityComponent类中定义了很多provider成员,这些成员就是Module中提供的一些provider方法,还有其中的一些成员方法中的参数,那么这些各个类构造函数是怎么调用的呢,其实,我们Module中每一个定义的provide方法,都会生成一个MainActivityModule_ProvideMainActivityPresenterFactory类似的类
[java] view plain copy print?
package com.example.lwp.mvp.ui.activity.module;
import com.example.lwp.mvp.model.User;
import com.example.lwp.mvp.ui.activity.MainActivity;
import com.example.lwp.mvp.ui.activity.presenter.MainActivityPresenter;
import dagger.internal.Factory;
import javax.annotation.Generated;
import javax.inject.Provider;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivityModule_ProvideMainActivityPresenterFactory implements Factory<MainActivityPresenter> {
private final MainActivityModule module;
private final Provider<MainActivity> mainActivityProvider;
private final Provider<User> userProvider;
public MainActivityModule_ProvideMainActivityPresenterFactory(MainActivityModule module, Provider<MainActivity> mainActivityProvider, Provider<User> userProvider) {
assert module != null;
this.module = module;
assert mainActivityProvider != null;
this.mainActivityProvider = mainActivityProvider;
assert userProvider != null;
this.userProvider = userProvider;
}
@Override
public MainActivityPresenter get() {
MainActivityPresenter provided = module.provideMainActivityPresenter(mainActivityProvider.get(), userProvider.get());
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<MainActivityPresenter> create(MainActivityModule module, Provider<MainActivity> mainActivityProvider, Provider<User> userProvider) {
return new MainActivityModule_ProvideMainActivityPresenterFactory(module, mainActivityProvider, userProvider);
}
}
可以看到,这里面在需要MainActivityPresenter时候可以调用它的get方法,MainActivityPresenter的构造函数依赖另外两个对象,我们看他们其中他一个的Factory函数
[java] view plain copy print?
package com.example.lwp.mvp.ui.activity.module;
import com.example.lwp.mvp.ui.activity.MainActivity;
import dagger.internal.Factory;
import javax.annotation.Generated;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivityModule_ProvideMainActivityFactory implements Factory<MainActivity> {
private final MainActivityModule module;
public MainActivityModule_ProvideMainActivityFactory(MainActivityModule module) {
assert module != null;
this.module = module;
}
@Override
public MainActivity get() {
MainActivity provided = module.provideMainActivity();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<MainActivity> create(MainActivityModule module) {
return new MainActivityModule_ProvideMainActivityFactory(module);
}
}
这是MainActivity的Provider,可以看到它的get函数最后调用了module也就是MainActivityModule中的provideMainActivity,这里就直接返回了一个MainActivity,所以,如果我们的构造函数中含有参数,dragger也会调用相应参数的Provider的Facory来生成相应的参数
从这里也可以看出这些类之间的构造依赖不能构成环路。
}在component中inject fragment就好
@Activity
@Component(dependencies = AppComponent.class, modules = {HomeModule.class, ActivityModule.class})
public interface HomeComponent {
void inject(HomeFragment fragment);
}
AppComponent通常提供全局的对象以便于其他的组件依赖使用,比如context,rest api接口等,这些都是全局的单例对象
MainActivityComponent特意针对MainActivity,所以它只提供其对应的MainActivityPresenter,因为其依赖AppComponent,所以它可以使用AppComponent提供的对象
这里使用http://blog.csdn.net/tiankong1206/article/details/46486401 这里的一个例子,主要把其中的一些细节稍微说的详细点,下面这一段说明来自网上:
@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。
1、首先是Module
[java] view plain copy print?
@Module
public class MainActivityModule {
private MainActivity mainActivity;
public MainActivityModule(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
@ActivityScope
MainActivity provideMainActivity() {
return mainActivity;
}
@Provides
@ActivityScope
MainActivityPresenter provideMainActivityPresenter(MainActivity mainActivity, User user) {
return new MainActivityPresenter(mainActivity, user);
}
}
注意里面的provide方法,我们后面还可以看到,这里的语法是@Module @Providers
然后是Component
[java] view plain copy print?
@ActivityScope
@Component(modules = {MainActivityModule.class , AppServiceModule.class})
public interface MainActivityComponent {
MainActivity inject(MainActivity mainActivity);
}
这里的MainActivityComponent包含两个Module,一个是我们上面列出来的MainActivityModule,另一个是AppServiceModule
接下来就是使用了,在MainActivity中:
[java] view plain copy print?
@Override
protected void setupActivityComponent() {
DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.appServiceModule(new AppServiceModule())
.build()
.inject(this);
}
这里在build之前把Component用到的每一个Module的构造函数初始化一下,在build之后inject注入,我们看一下这个自动生成的DaggerMainActivityComponent
[java] view plain copy print?
package com.example.lwp.mvp.ui.activity.component;
import com.example.lwp.mvp.data.AppServiceModule;
import com.example.lwp.mvp.data.AppServiceModule_ProvideUserFactory;
import com.example.lwp.mvp.model.User;
import com.example.lwp.mvp.ui.activity.MainActivity;
import com.example.lwp.mvp.ui.activity.MainActivity_MembersInjector;
import com.example.lwp.mvp.ui.activity.module.MainActivityModule;
import com.example.lwp.mvp.ui.activity.module.MainActivityModule_ProvideMainActivityFactory;
import com.example.lwp.mvp.ui.activity.module.MainActivityModule_ProvideMainActivityPresenterFactory;
import com.example.lwp.mvp.ui.activity.presenter.MainActivityPresenter;
import dagger.MembersInjector;
import dagger.internal.MembersInjectors;
import dagger.internal.ScopedProvider;
import javax.annotation.Generated;
import javax.inject.Provider;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerMainActivityComponent implements MainActivityComponent {
private Provider<MainActivity> provideMainActivityProvider;
private Provider<User> provideUserProvider;
private Provider<MainActivityPresenter> provideMainActivityPresenterProvider;
private MembersInjector<MainActivity> mainActivityMembersInjector;
private DaggerMainActivityComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
private void initialize(final Builder builder) {
this.provideMainActivityProvider = ScopedProvider.create(MainActivityModule_ProvideMainActivityFactory.create(builder.mainActivityModule));
this.provideUserProvider = AppServiceModule_ProvideUserFactory.create(builder.appServiceModule);
this.provideMainActivityPresenterProvider = ScopedProvider.create(MainActivityModule_ProvideMainActivityPresenterFactory.create(builder.mainActivityModule, provideMainActivityProvider, provideUserProvider));
this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), provideMainActivityPresenterProvider);
}
@Override
public MainActivity inject(MainActivity mainActivity) {
mainActivityMembersInjector.injectMembers(mainActivity);
return mainActivity;
}
public static final class Builder {
private MainActivityModule mainActivityModule;
private AppServiceModule appServiceModule;
private Builder() {
}
public MainActivityComponent build() {
if (mainActivityModule == null) {
throw new IllegalStateException("mainActivityModule must be set");
}
if (appServiceModule == null) {
this.appServiceModule = new AppServiceModule();
}
return new DaggerMainActivityComponent(this);
}
public Builder mainActivityModule(MainActivityModule mainActivityModule) {
if (mainActivityModule == null) {
throw new NullPointerException("mainActivityModule");
}
this.mainActivityModule = mainActivityModule;
return this;
}
public Builder appServiceModule(AppServiceModule appServiceModule) {
if (appServiceModule == null) {
throw new NullPointerException("appServiceModule");
}
this.appServiceModule = appServiceModule;
return this;
}
}
}
这里面有两个类,一个是DaggerMainActivityComponent,另一个是Build类,Build中就是几个模块的初始化以及build方法构建DaggerMainActivityComponent类并初始化。DaggerMainActivityComponent类中定义了很多provider成员,这些成员就是Module中提供的一些provider方法,还有其中的一些成员方法中的参数,那么这些各个类构造函数是怎么调用的呢,其实,我们Module中每一个定义的provide方法,都会生成一个MainActivityModule_ProvideMainActivityPresenterFactory类似的类
[java] view plain copy print?
package com.example.lwp.mvp.ui.activity.module;
import com.example.lwp.mvp.model.User;
import com.example.lwp.mvp.ui.activity.MainActivity;
import com.example.lwp.mvp.ui.activity.presenter.MainActivityPresenter;
import dagger.internal.Factory;
import javax.annotation.Generated;
import javax.inject.Provider;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivityModule_ProvideMainActivityPresenterFactory implements Factory<MainActivityPresenter> {
private final MainActivityModule module;
private final Provider<MainActivity> mainActivityProvider;
private final Provider<User> userProvider;
public MainActivityModule_ProvideMainActivityPresenterFactory(MainActivityModule module, Provider<MainActivity> mainActivityProvider, Provider<User> userProvider) {
assert module != null;
this.module = module;
assert mainActivityProvider != null;
this.mainActivityProvider = mainActivityProvider;
assert userProvider != null;
this.userProvider = userProvider;
}
@Override
public MainActivityPresenter get() {
MainActivityPresenter provided = module.provideMainActivityPresenter(mainActivityProvider.get(), userProvider.get());
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<MainActivityPresenter> create(MainActivityModule module, Provider<MainActivity> mainActivityProvider, Provider<User> userProvider) {
return new MainActivityModule_ProvideMainActivityPresenterFactory(module, mainActivityProvider, userProvider);
}
}
可以看到,这里面在需要MainActivityPresenter时候可以调用它的get方法,MainActivityPresenter的构造函数依赖另外两个对象,我们看他们其中他一个的Factory函数
[java] view plain copy print?
package com.example.lwp.mvp.ui.activity.module;
import com.example.lwp.mvp.ui.activity.MainActivity;
import dagger.internal.Factory;
import javax.annotation.Generated;
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivityModule_ProvideMainActivityFactory implements Factory<MainActivity> {
private final MainActivityModule module;
public MainActivityModule_ProvideMainActivityFactory(MainActivityModule module) {
assert module != null;
this.module = module;
}
@Override
public MainActivity get() {
MainActivity provided = module.provideMainActivity();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<MainActivity> create(MainActivityModule module) {
return new MainActivityModule_ProvideMainActivityFactory(module);
}
}
这是MainActivity的Provider,可以看到它的get函数最后调用了module也就是MainActivityModule中的provideMainActivity,这里就直接返回了一个MainActivity,所以,如果我们的构造函数中含有参数,dragger也会调用相应参数的Provider的Facory来生成相应的参数
从这里也可以看出这些类之间的构造依赖不能构成环路。
}在component中inject fragment就好
@Activity
@Component(dependencies = AppComponent.class, modules = {HomeModule.class, ActivityModule.class})
public interface HomeComponent {
void inject(HomeFragment fragment);
}
相关文章
- KAPTEN&SON注册过商标吗?还有哪些分类可以注册?
- 大雅会议系统主要是什么产品?是那个品牌的?
- 爱音乐的徐梦圆资料
- 乡村乱情第十八部8章节
- how what 是什么语法
- 朱元璋建立的藩王制度,您怎么看?
- 求Adobe Illustrator CS6 标注尺寸插件,怎么添加增效工具
- Altium designer中,从原理图到pcb中中,Add pin to nets,所有的都是错误?但是Excute后,是可以的?
- 宝宝周岁生日派对怎么布置?
- 网络电视优酷xl被强制升级怎么办?
- 联想Y410p怎么样才能玩吃鸡
- 全部奥特曼无敌版游戏
- Ipad4中如何给pages加字体
- 京政发2016年24号文
- 英语翻译:中国有名的名胜古迹你都听说过哪些?
- 漫威内战2最后谁赢了
- 日本 产经新闻 记者
- ugg和ugg australia的区别
- 窗帘什么布料好
- was和were是什么意思,怎么用个用法,什么时候用
- 本周热门
-
- tsf物语漫画全集无修
- h版58部大片 迅雷下载
- 佐佐木明希跟老公上司偷情 中途上司打电话给他老公 后边被侦探发现是什么作品?
- ofje104在线观看
- 雷神加速器连接不上是什么原因?
- 法国人的作息时间
- 用麻将可以摆出什么美丽的图案图片
- "Helix Studios - Spank This - Skyelr Bleu, Roxy Red & Zack Mason.m4v"高清完整版下载,感谢哈
- 群星怎么创建星域
- 纽仕兰奶粉事件曝光是个怎么回事
- 纲手对鸣人的惩罚
- com.lovelycat猫咪下载
- 景德镇六八宝麻将图片
- 动漫女孩痛苦被吸奶
- 有人会写马来文作文吗?题目是Hobi saya。大概350字。急用....2011年1月9日之前一定要用到...谢谢
- 一男一女在交肛的图
- shutdown -s -t都是什么意思?
- 魔界之龙珠武功排名
- 《大太监》最新txt全集下载
- gta5线上模式茉德任务第一个人位置在哪?
- 白青树宁连城婚前番外
- Genesis汉化](C79)(同人志)[TIES (タケイオーキ)] ず~っと!FireSisters★ (化物语)
- 喂奶门事件完整版
- xshell设置默认输入法
- 英文wontfix的中文什么意思
- 天帝攻x魔尊受,是生子的
- off road是什么意思
- 斗罗大陆之舞奴 2
- 三国杀小乔本子资源
- 为什么女生会操出水来