Компонент Кинжала, Получающий Из Класса Приложения? - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в кинжале в android, мне нужно получить объект непосредственно из компонента, но мне нужно знать, является ли это правильным способом.
Пример Класс, который мне нужно внедрить, используя кинжал

@Singleton
class Testing @Inject constructor(){

}
@Singleton
@Component(...)
interface AppComponent {
    ...

@Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: MyApplication): Builder

        fun build(): AppComponent
    }

    fun getTest(): Testing

    fun inject(application: MyApplication)
}
class Myapplication : Application(){

    lateinit var appComponent : AppComponent

    override fun onCreate() {
        super.onCreate()
        initializeDagger()
    }

    private void initializeDagger() {
        appComponent = DaggerAppComponent.builder()
                .application(this)
                .build();
        appComponent.inject(this);

    }
}

Для получения инъекционного класса, например Testing

class Tester {

 fun getTesting() : Testing{
   return applicationContext.appComponent.getTest()
 }
}

Мне нужно знать, что это правильный способ или любое другое альтернативное решение есть в наличии?
Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 29 апреля 2020

Я думаю, что вместо getTest() вы можете использовать @Inject lateinit var test: Testing. Также вам нужно создать еще одну функцию inject(), которая получает ваш класс и использует DaggerAppComponent.create().inject(this) в вашем классе. Dagger автоматически введет его вам.

Для получения дополнительной информации, проверьте эту страницу . У него есть базовый c материал Dagger.

В любом случае, у Dagger 2 также есть другой способ реализации, в котором вам даже не нужно иметь inject() внутри вашего класса.

Редактировать : Вот мой код о простом Dagger

class Info @Inject constructor(){
    val text = "Dagger2"
}

@Component()
interface InfoComponent {
    fun inject(app: MainActivity)
    fun inject(box: Box)
}

class Box {
    @Inject
    lateinit var info: Info

    init {
        DaggerInfoComponent.create().inject(this)
    }

    fun getInfo(): String {
        return info.text
    }
}

class MainActivity : AppCompatActivity() {

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

        val box = Box()
        hello_text.text = box.getInfo()
    }
}

Вы также можете искать больше об AndroidInjector, с ним вам не нужно явно вставлять inject() функцию в каждый класс, который вам необходим для инъекции

...