2017-07-28 102 views
16

我目前正在使用InstantApps進行試驗,並且希望將匕首加入到我的項目中。使用Dagger的應用程序組件構建Android即時應用程序

我正面臨設置應用程序AppComponent的問題。我的應用程序組件包括我的應用程序的所有功能匕首模塊。

我主要有:

  • 一個基本應用模塊含有我的應用程序類
  • 多個特徵每個活動每個匕首模塊,全部用鹼作爲依賴性。
  • 一個應用程序模塊和即時模塊都導入所有功能和基本應用程序模塊。

我想在添加即時應用程序模塊之前弄清楚設置。

來自InstantApps文檔和項目示例。看起來應用程序類需要在Base中。從Dagger文檔到安裝匕首:

DaggerYourAppComponent.create().inject(this); 

應包含在您的應用程序類中。然而,這似乎是不可能的,因爲AppComponent需要引用所有的功能匕首模塊。

問題是:

  • 我應該在哪裏加我AppComponent匕首模塊?
  • 我是否應該將應用程序保留在應用程序模塊中而不是在Base中?
  • 任何GitHub回購或Dagger附帶Instant應用程序的文檔?

謝謝

+0

從這[InstantApps兼容圖書館](https://developer.android.com/topic/instant-apps/prepare.html#identify_tested_compatible_libraries)鏈接,也許匕首不僅僅支持... –

+0

該鏈接僅適用於Google圖書館,不適用於第三方-派對。 – TWL

+0

你可以檢查這個網址https://github.com/ragdroid/instant-app-dagger它可以幫助你。 –

回答

9
  • Dagger2是非常有即時的應用程序支持。您可以爲每個要素模塊和相應的Dagger提供者類創建組件類,以公開每個要素模塊的組件類實例。
  • 每個模塊組件類都可以爲僅包含在該特徵模塊中的類聲明注入方法。
  • 此外,您還可以在 基本模塊中的應用程序組件類中進行應用程序範圍注入。
  • 應用程序組件類可以在包含在基本模塊中的 應用程序類中實例化,並通過應用程序類中的靜態方法公開給其他 功能模塊。

下面是一個示例代碼Dagger2注入與即時應用程序,使事情更清晰。 https://github.com/willowtreeapps/android-instant-apps-demo

+0

感謝您使用@Vishy。我認爲你是對的,我需要每個功能一個組件。不過,我仍然在尋找一個使用android dagger支持的示例,以及來自[here](https://google.github.io/dagger/android)的'AndroidInjection.inject(MyActivity.this)'和AndroidInjector。 HTML)。有關更新您的樣品的任何計劃? –

+0

更具體地說,在[tutorial](https://google.github.io/dagger/android.html#injecting-activity-objects)的第3步: '@Component(modules = {... ,YourActivityModule.class}) 接口YourApplicationComponent {}' 這一步不可行,因爲我的應用程序組件對ActivityModule沒有可見性,因爲它在特徵模塊中。 –

0

我寫了一篇關於這方面的文章,其中有很多細節:Dagger2 for Modular Architecture,但下面簡短的回答。

你必須以不同的方式使用Dagger2。您無需爲每個功能模塊使用模塊或子組件,而需要使用具有對基本AppComponent的依賴關係的組件。

在一個模塊中,我們通常是這樣做:

@Singleton 
@Component(modules = arrayOf(NetworkModule::class, RepositoryModule::class, 
        SubcomponentModule::class)) 
interface ApplicationComponent : AndroidInjector<MyApplication> { 
    val userRepository: UserRepository 
    val apiService: ApiService 
} 

@Module 
object NetworkModule { 
    @Provides 
    @Singleton 
    @JvmStatic 
    fun provideApiService(okHttp: OkHttp): ApiService { 
    return ApiSerive(okHttp) 
    } 
} 

但正如你說你沒有訪問SubComponentModule這可能是在其他功能模塊的另一個模塊或引用匕首模塊。

您只需創建一個功能模塊中根據ApplicationComponent這樣一個新的匕首模塊:

@Browser 
@Component(modules = [(BrowserModule::class)], 
     dependencies = [(AppComponent::class)]) 
interface BrowserComponent : AndroidInjector<AppCompatActivity> { 
    @Component.Builder 
    abstract class Builder: AndroidInjector.Builder<AppCompatActivity>(){ 
    /** 
    * explicity declare to Dagger2 
    * that this builder will accept an AppComponent instance 
    **/ 
    abstract fun plus(component: AppComponent): Builder 
    } 
} 

以及相應的功能活動將構建組件:

class BrowserActivity : AppCompatActivity() { 
    override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    DaggerBrowserComponent 
     .builder() 
     /** 
     * we have to provide an instance of the AppComponent or 
     * any other dependency for this component 
     **/ 
     .plus((application as MyApplication).component) 
     .build() 
     .inject(this) 
    } 
} 
相關問題