Android - инъекция кинжала во время выполнения - PullRequest
1 голос
/ 09 апреля 2019

Мне нужно ввести класс во время выполнения, используя кинжал.что моя проблема в том, что я получаю ошибку во время компиляции при локальном внедрении класса в метод, а также я не смог внедрить во время выполнения без использования константы для @ Named

Пример

interface PerformActionInterface{
      fun performAction()
}

class P1 : PerformActionInterface{
   override fun performAction(){
   }
}

class P2 : PerformActionInterface{
   override fun performAction(){
   }
}


class PerformAction @Inject constructor(){

      fun perform(name : String){

        @Inject
        @Named(name)
        performActionInterface : PerformActionInterface

        performActionInterface.performAction()
    }
}

были какв реализации кинжала я буду делать так

1 Ответ

2 голосов
/ 16 апреля 2019

Вы не можете комментировать что-либо во время выполнения, значение элемента в аннотации Java должно быть константным выражением .

Но этот вариант использования можно решить с помощью карты multibind.

В вашем Module, кроме просто @Bind или @Provide, также аннотируйте абстрактное веселье с помощью @IntoMap и ключа карты (извините за любые ошибки в моем Kotlin)

@Binds
@IntoMap
@StringKey("p1")
abstract fun bindP1Class(p1: P1): PerformActionInterface

@Binds
@IntoMap
@StringKey("p2")
abstract fun bindP2Class(p2: P2): PerformActionInterface

Затем в вашем PerformAction классе объявите зависимость карты от String до PerformActionInterface и делайте с картой все что угодно:

// map value type can be Lazy<> or Provider<> as needed
class PerformAction @Inject constructor(
        val map: Map<String, @JvmSuppressWildcards PerformActionInterface>) {

    fun perform(name: String) {
        map.get(name)?.performAction()
        // or do something if the get returns null
    }
}
...