Внедрение поля в kotlin всегда равно нулю - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь выполнить инъекцию поля в классе, отличном от Activity, но я всегда получаю, что поле не было инициализировано / равно нулю. Я прочитал Могу ли я использовать инъекцию поля Dagger 2 в Kotlin? , а также Dagger 2 в Android аннотированный класс @Singleton, который не внедряется , и все еще иметь ту же проблему. Вот как я его настроил

Это класс модели

class Greetings {
    val sayHello: String = "Hello from Dagger 2" 
}

Это класс модуля

@Module
class GreetingsModule {
    @Provides
    @Singleton
    fun providesGreetings(): Greetings {
        return Greetings()
    }
}

Это компонент

@Singleton
@Component(modules = arrayOf(GreetingsModule::class))
interface GreetingsComponent {
    fun inject(mainActivity: MainActivity)
    fun inject(testGreetings: TestGreetings)
}

И класс, который расширяется от Application

class App: Application() {
    private lateinit var greetingsComponent: GreetingsComponent
    override fun onCreate() {
        super.onCreate()
        greetingsComponent = DaggerGreetingsComponent.builder().build()
    }
    fun getGreetings() = greetingsComponent
}

И вот как я вставляю его в другой класс, и где значение null / не инициализировано

class TestGreetings {
    @Inject
    lateinit var greetings: Greetings
    fun checkIfNull() {
        if  (greetings != null) {
            Log.d("INFO", "${ greetings.sayHello}")
        } else {
            Log.d("INFO", "null !!!!!!")

        }
    }
}

Что именно Я делаю не так ??

1 Ответ

0 голосов
/ 13 июля 2020

хорошо, я постараюсь ответить

Вы не можете использовать Field Injection, которое Greetings в классе TestGreetings, потому что Dagger не знает, как его ввести.

Внедрение полей обычно используется для компонентов, связанных с Android Framework, поэтому в вашем случае MainActivity

TestGreetings класс не Android Framework, поэтому лучше использовать Внедрение конструктора, например

class TestGreetings(private val greetings: Greetings) {

    fun checkIfNull() {
        if  (greetings != null) {
            Log.d("INFO", "${ greetings.sayHello}")
        } else {
            Log.d("INFO", "null !!!!!!")

        }
    }
}

Чтобы Dagger знал, как инициализировать класс TestGreetings, вам необходимо определить его в GreetingsModule class

@Module
class GreetingsModule {
    ...
    @Provides
    @Singleton
    fun providesTestGreetings(greetings: Greetings): TestGreetings {
        return TestGreetings(greetings)
    }
}

Теперь вы можете используйте TestGreetings класс в MainActivity

class MainActivity: AppCompatActivity() {
   @Inject
   lateinit var testGreetings: TestGreetings
   
   override fun onCreate(savedInstanceState: Bundle?) {
       ...
       testGreetings.checkIfNull()
   }
}

Наконец, вы можете удалить fun inject(testGreetings: TestGreetings) в GreetingsComponent

Ps Убедитесь, что ваша настройка Dagger в MainActivity верна

Надеюсь, это проясняет ситуацию :)

...