2017-08-19 54 views
1

比方说,我有这样定义的类A如何通过当前活动被注入到对象中Dagger2

class A { 

    Activity c; 

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

    public void dosomething() { } 

} 

而且我有一个这样定义的活动:

public class MyActivity extends AppCompatActivity { 

    @Inject A myObject; 

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

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

回答

3

您必须将活动提供给负责构建myObject的组件。要做到这一点的方法之一是创建一个ActivityScope

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

在此范围内,您将创建用于注入活动的领域的inject()方法的组成部分。

请注意,如果您想在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); 

编辑
在回答你的问题,你需要@Inject注释构造函数中A。这将给Dagger创建一个实例的方法。如果这是不可能的,你可以在模块中添加提供程序的方法,但它是一个有点更多的工作:

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

我试过这个解决办法,但我得到了更多的错误: 错误:(22,10)错误: me.ha.colorselector.MainActivity不能提供没有@Inject构造函数或从@提供注释的方法。此类型支持成员注入,但不能隐式提供。 – Oussaki

+0

@Oussaki啊,我忽略了那个。我为你编辑了我的答案。 –

相关问题