如何将当前Activity传递给Dagger2中要注入的对象

3
假设我有一个名为A的类,定义如下:
class A {

    Activity c;

    public A(Activity c) {
        this.c = c;
        // do something
    }

    public void dosomething() { }

}

我有一个像这样定义的Activity:

public class MyActivity extends AppCompatActivity {

    @Inject A myObject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myObject.dosomething();
    }
}

我该如何将当前活动提供给我的对象?

1个回答

7

您需要使这个活动对负责构建myObject的组件可用。一种方法是创建一个ActivityScope

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

在这个范围内,您可以创建一个具有inject()方法的组件,用于注入Activity的字段。

请注意,如果您想要在MyActivityComponent中使用更广泛范围组件的对象图,则可以添加依赖。在这里,我将其依赖于名为ApplicationComponent的类。

@ActivityScope
@Component(
        dependencies = {ApplicationComponent.class}, 
        modules = { MyActivityModule.class}
)
public interface MyActivityComponent {

    void inject(MyActivity myActivity);

}

该组件具有一个模块,提供MyActivity实例。
@Module
public class MyActivityModule {

    private final MyActivity myActivity;

    public MyActivityModule(MyActivity myActivity) {
        this.myActivity = myActivity;
    }

    @Provides
    @ActivityScope
    MyActivity provideActivity() {
        return myActivity;
    }

}

在您的活动中的 onCreate() 方法内,您现在可以将 this 对象提供给模块,在 ActivityScope 中使其可用。
//Inside your activity's onCreate:
DaggerMyActivityComponent.builder()
        .myActivityModule(new MyActivityModule(this))
        .build()
        .inject(this);

编辑
回答您的问题,您需要在A的构造函数上添加@Inject注解。这样可以让Dagger创建一个实例。如果不可能,您可以在模块中添加提供程序方法,但需要更多的工作:

//Don't do this if you can annotate the constructor with @Inject.
@Provides
A provideA(MyActivity myActivity) {
    return new A(myActivity);
}

我尝试了这个解决方案,但是出现了更多的错误: 错误:(22,10)错误:me.ha.colorselector.MainActivity不能在没有@Inject构造函数或从@Provides注释方法提供的情况下提供。该类型支持成员注入,但不能隐式提供。 - Oussaki
@Oussaki 啊,我忽略了那个。我为你编辑了我的答案。 - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接