2017-07-28 15 views
16

Şu anda InstantApps ile deneme yapıyorum ve projeme hançer eklemek istiyorum.Dagger'dan Uygulama Bileşeniyle bir Android Hazır Uygulaması Oluşturma

Bir uygulama AppComponent ayarlamayla ilgili bir sorunla karşı karşıyayım. Uygulama bileşenim, uygulamamın tüm özellik hançer modülleri içeriyor.

Temelde var:

  • Bir Baz uygulaması modülü

    bir bağımlılık olarak Base ile Etkinlik Başına her bir hançer Modülü, tüm benim Uygulama sınıfı
  • Çoklu özellikler içeren.
  • tek bir uygulama modülü ve anlık modülü hem ithal tüm özellikleri ve taban uygulaması modülü.

Ben Anında Uygulama modülü eklemeden önce kurulum anlamaya çalışıyorum.

InstantApps belgelerinden ve proje örneklerinden. Uygulama sınıfının Base'de olması gerektiği gibi görünüyor. Hançer dokümantasyonundan, kurulum hançerine: Uygulama sınıfınızda yer almalıdır. Ancak, bu, AppComponent'in tüm özellik hançer modüllerine başvurması gerektiğinden, bu imkansız gibi görünmektedir.

Benim sorulara

şunlardır:

    benim AppComponent hançer modülü eklemek gerekir
  • ?
  • Uygulamamı uygulama modülünde tutmalı mıyım?
  • Herhangi bir GitHub repo veya Instant Apps ile Dagger hakkındaki belgeler?

Eğer

+0

[InstantApps Uyumlu

Sadece böyle ApplicationComponent bağlı bir özellik modülünde yeni bir hançer modül oluşturabilir Kütüphaneler] (https://developer.android.com/topic/instant-apps/prepare.html#identify_tested_compatible_libraries) link, belki hançer henüz desteklenmiyor ... –

+0

Bu bağlantı sadece Google kütüphaneleri içindir, 3. değil -Parti. – TWL

+0

Bu URL'yi kontrol edebilirsiniz https://github.com/ragdroid/instant-app-dagger size yardımcı olabilir. –

cevap

9
  • Dagger2 çok Anında uygulamalarla desteklenmektedir ederiz. Her bir özellik modülü için Bileşen sınıfları ve her özellik modülü için bileşen sınıfı örneğini açığa çıkarmak için karşılık gelen bir Hançer sağlayıcı sınıfı oluşturabilirsiniz.
  • Her modül bileşen sınıfı, yalnızca bu özellik modülünde bulunan sınıflar için enjekte etme yöntemleri bildirebilir. Ayrıca, geniş uygulama için ana modülünde bir Uygulama bileşeni sınıfına sahip olabilirsiniz.
  • Uygulama bileşeni sınıfı, temel modülde bulunan ve diğer özellik modüllerine uygulama sınıfındaki statik yöntemle Uygulama sınıfında başlatılabilir.

İşte işleri daha net hale getirmek için Hızlı uygulamalarla Dagger2 enjeksiyonunun örnek kodudur. https://github.com/willowtreeapps/android-instant-apps-demo

+0

@Vishy için teşekkürler. Bence haklısın, özellik başına bir bileşene ihtiyacım var. Ancak, hala Android hançer desteği ve AndroidInjection.inject (MyActivity.this) 've AndroidInjector kullanan bir örnek arıyorum [burada] (https://google.github.io/dagger/android. html). Numunenizi güncellemek için herhangi bir planın var mı? –

+0

Daha spesifik olmak gerekirse, [öğretici] 'nin 3. adımında (https://google.github.io/dagger/android.html#injecting-activity-objects): '@Component (modules = {... , YourActivityModule.class}) arabirimi YourApplicationComponent {} ' Bu adım, uygulama bileşenimin bir özellik modülünde olduğu gibi" ActivityModule "üzerinde görünür olmaması nedeniyle yapılamaz. –

0

Bu konuyla ilgili bir makale yazdım: Dagger2 for Modular Architecture, ancak kısa cevabı takip ederek.

Dagger2'yi farklı bir şekilde kullanmak zorundasınız. Her özellik modülü için bir modül veya alt bileşen kullanmak yerine, temel AppComponent'e bağımlı olan bir bileşen kullanmanız gerekir. Biz genellikle tek modülde

böyle bir şey yapmak:

@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) 
    } 
} 

Ama dediğin gibi başka özellik modülünde başka modül veya referans hançer modüllerde olabilir SubComponentModule erişimi yok.

@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 
    } 
} 

Ve bileşeni inşa edecek karşılık gelen özellik aktivite: Bundan

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) 
    } 
} 
İlgili konular