2017-08-19 66 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啊,我忽略了那個。我爲你編輯了我的答案。 –

相關問題