2015-06-07 147 views
24

我正在使用匕首2並讓它工作,但我現在需要訪問Android應用程序上下文。匕首2注入Android上下文

它不清楚如何注入並獲得訪問上下文。我試圖做到這一點,如下所示:

@Module 
public class MainActivityModule {  
    private final Context context; 

    MainActivityModule(Context context) { 
     this.context = context; 
    } 

@Provides @Singleton 
Context provideContext() { 
    return context; 
} 

然而這會導致以下異常:

了java.lang.RuntimeException:無法創建應用程序:java.lang.IllegalStateException:mainActivityModule必須設置

如果我檢查匕首生成的代碼此異常這裏提出:

public Graph build() { 
    if (mainActivityModule == null) { 
     throw new IllegalStateException("mainActivityModule must be set"); 
    } 
    return new DaggerGraph(this); 
} 

我不確定這是否是正確的方式獲取上下文注入 - 任何幫助將不勝感激。

+0

我不知道,如果注射應用的上下文說得通。您可以擴展Application類並創建該應用程序的靜態實例。你可以命名它,例如'BaseApplication'。之後,您可以在擴展的Application類中創建'get()'方法,該方法將返回該實例並同時成爲Application Context。然後,您可以使用以下構造從項目中的任何位置訪問應用程序上下文:'BaseApplication.get()'。您應該謹慎使用,並且只在必要時使用。 –

回答

20
@Module 
public class MainActivityModule {  
    private final Context context; 

    public MainActivityModule (Context context) { 
     this.context = context; 
    } 

    @Provides //scope is not necessary for parameters stored within the module 
    public Context context() { 
     return context; 
    } 
} 

@Component(modules={MainActivityModule.class}) 
@Singleton 
public interface MainActivityComponent { 
    Context context(); 

    void inject(MainActivity mainActivity); 
} 

然後

MainActivityComponent mainActivityComponent = DaggerMainActivityComponent.builder() 
    .mainActivityModule(new MainActivityModule(MainActivity.this)) 
    .build(); 
+0

你能解釋一下你在哪裏取代MainActivityModule嗎? –

+1

@IgorGanapolsky我不知道爲什麼我會用AppContext。不過,它的工作原理基本上是一樣的。 – EpicPandaForce

+0

@EpicPandaForce在活動中,我應該使用DI還是隻使用'this'?例如,要在活動中顯示對話框 –