Подкомпонент Dagger 2 в модулях Android - PullRequest
0 голосов
/ 05 декабря 2018

Недавно я начал делить наше приложение на более мелкие модули Android, но я не могу понять, как структурировать кинжал, чтобы он работал для меня.

Мой подход состоит в том, чтобы разделить «большие» функции на более мелкие модули,Большинство моих функций пока находятся в модуле base.

То, что я сейчас работаю:

         App
          ^ 
          |
         Base
          ^
          |
      Mvvm core

Настройка MyDagger состоит из:
- @Singleton ограничен AppComponent
- @UserScope подкомпонент UserComponent

Оба они размещены в модуле Base.

Чего я пытаюсь достичь:

         App
          ^ 
          |
Feature 1 - Feature 2
          ^
          |
         Base
          ^
          |
      Mvvm core

Мой план состоит в том, чтобы каждая функция имела@FeatureX подкомпонента в их собственном модуле - но здесь все разваливается.

Я не могу понять, как выставить SubComponent.Build каждому из моих функциональных модулей.

Это даже правильный подход или что я упускаю?

Информация о бонусе: я также пытался переместить AppComponent & UserComponent в модуль App, но у меня нет доступа к компоненту, который мне нужен для инъекции, из моего функционального модуля (ов).

1 Ответ

0 голосов
/ 05 декабря 2018

Допустим, вы создали модуль Android с именем cookie, который содержит действие и модуль кинжала.

CookieActivity:

class CookieActivity : DaggerAppCompatActivity() {

    @Inject
    lateinit var name: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_cookie)

        findViewById<TextView>(R.id.name).text = name
    }
}

CookieModule:

@Module
abstract class CookieModule {

    @ContributesAndroidInjector
    abstract fun cookieActivity(): CookieActivity

    @Module
    companion object {

        @Provides
        @JvmStatic
        fun provideName() = "Oreo"
    }
}

Теперь вы хотите использовать это CookieActivity из вашего основного приложения.Сначала вам нужно создать AppComponent (обратите внимание, что CookieModule установлен внутри компонента):

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, CookieModule::class])
interface AppComponent : AndroidInjector<App>

Затем ваш класс Application может вводить активность и фрагмент:

class App : Application(), HasActivityInjector, HasSupportFragmentInjector {

    @Inject
    internal lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

    @Inject
    internal lateinit var dispatchingFragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder()
            .build()
            .inject(this)
    }
    override fun activityInjector(): AndroidInjector<Activity>? {
        return dispatchingActivityInjector
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
        return dispatchingFragmentInjector
    }
}

Теперь вы можете использовать CookieActivity, и основное приложение позаботится об инъекции:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(this, CookieActivity::class.java)
            startActivity(intent)
        }
    }
}

«Oreo» будет отображаться в соответствии с CookieModule.

...