Dagger2 注入 child object

Dagger2 injection into child object

不确定标题是否清楚,但我实际拥有的是:

模块:

@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);
}

在我的应用程序中,我创建了这样的组件:

userComponent = DaggerUserComponent.builder().testUserModule(new TestUserModule(user)).build();

所以,在我的 activity 中一切正常,我可以使用 @Inject User user; 它工作正常。

现在在我的 Activity 中,如果我创建一个 Object Foo,它看起来像这样:

public class Foo {

@Inject
User user;

MyActivity activity;

public Foo(MyActivity activity){
this.activity = activity;
}
} 

通过使用 new Foo() 在我的 activity 中实例化 Foo,我知道我的用户不会被注入。

所以我的问题是,我必须在我的代码中更新什么才能在我的 activity 中注入 Foo object(如果我想注入,我认为这是方法Foo 中的用户,但如果我错了请告诉我)?

此外,哪里是构建我的组件的好地方?应用程序中的所有内容 ??

谢谢

您有 4 个选择:

1.使用:

@Inject
Foo mFoo;

如果 foo 的生命周期与 activity 的生命周期完全相同,请使用此方法。

2。使用 Lazy:

@Inject
Lazy<Foo> mLazyFoo;

然后当你需要 Foo:

的实例时
Foo myFoo = mLazyFoo.get();

如果在 activity.

的整个生命周期中只需要一个 Foo,请使用此方法

3。使用 Provider

@Inject
Provider<Foo> mFooProvider;

并且当你需要实例时 Foo

Foo myFooFirstInstance = mFooProvider.get();

如果 activity.

中需要多个 Foo 实例,请使用此方法

4。手动注入 foo(不推荐):

在您的 UserComponent 中声明 void inject(Foo foo) 然后在您的方法中:

Foo myFoo = new Foo(...);
userComponent.inject(myFoo);

Also, where is a good place to build my component ? Everything in the App ??

对于android应用程序:是的,通常组件是在那里构建的。