不确定标题是否清楚但我实际拥有的是:
模块:
@Module
public class TestUserModule {
User user;
public TestUserModule(User user) {
this.user = user;
}
@Provides
@Singleton
public User providesUser() {
return user;
}
}
组件:
@Singleton
@Component(modules = {TestUserModule.class})
public interface UserComponent {
void inject(MyActivity activity);
void inject(MyActivity2 activity);
}
在我的App中我创建了这样的组件:
userComponent = DaggerUserComponent.builder().testUserModule(new TestUserModule(user)).build();
所以,在我的活动中一切正常,我可以使用@Inject User user;
它可以正常工作。
现在在我的Activity中,如果我创建一个Object Foo,它看起来像这样:
public class Foo {
@Inject
User user;
MyActivity activity;
public Foo(MyActivity activity){
this.activity = activity;
}
}
通过new Foo()
在我的活动中实例化Foo,我知道我的用户不会被注入。
所以我的问题是,我必须在我的代码中更新以便能够在我的活动中注入Foo对象(我想如果我想在Foo注入用户但是告诉我,如果我是错了)?
此外,构建组件的好地方在哪里? App中的一切??
谢谢
答案 0 :(得分:2)
您有4种选择:
<强> 1。使用强>
@Inject
Foo mFoo;
如果foo的生命周期与您活动的生命周期完全相同,请使用此方法。
<强> 2。使用Lazy
:
@Inject
Lazy<Foo> mLazyFoo;
然后当您需要Foo
的实例时:
Foo myFoo = mLazyFoo.get();
如果您在活动的整个生命周期中只需要一个Foo,请使用此方法。
第3。使用Provider
@Inject
Provider<Foo> mFooProvider;
当您需要实例Foo
Foo myFooFirstInstance = mFooProvider.get();
如果您的活动中需要多个Foo
个实例,请使用此方法。
<强> 4。手动注入你的foo(不推荐):
在UserComponent
声明void inject(Foo foo)
,然后在您的方法中:
Foo myFoo = new Foo(...);
userComponent.inject(myFoo);
此外,构建组件的好地方在哪里?一切都在 App ??
对于Android应用程序:是的,通常组件是在那里构建的。