Инъекция рукояти кинжала Котлина не инициализирована

#android #kotlin #dependency-injection #dagger #dagger-hilt

#Android #котлин #инъекция зависимости #кинжал #рукоять кинжала

Вопрос:

я пытаюсь использовать рукоятку кинжала, я все настроил, но я получаю и ошибку, когда пытаюсь использовать объект для ведьмы, я создаю инъекцию зависимости : kotlin.UninitializedPropertyAccessException: lateinit property exoPlayer has not been initialized

Вот мой поставщик модулей :

 @Module @InstallIn(ServiceComponent::class) object ServiceModule {  @ServiceScoped  @Provides  fun provideExoPlayer(  @ApplicationContext context: Context,  audioAttributes: AudioAttributes  ) = SimpleExoPlayer.Builder(context).build().apply {  setAudioAttributes(audioAttributes, true)  setHandleAudioBecomingNoisy(true)  } }  

В своей деятельности я получил :

 @AndroidEntryPoint class AudioActivity : AppCompatActivity(), Player.EventListener { {   @Inject  lateinit var exoPlayer: SimpleExoPlayer  

затем я пытаюсь добавить слушателя в onCreate

 exoPlayer.addListener(this)  

Но здесь я получил ошибку, что он не инициализирован, я действительно не понимаю, потому что я думал, что вся суть внедрения зависимостей заключалась в том, чтобы предоставить конструкцию, которую можно вводить везде. Так почему же он не был инициализирован?

Комментарии:

1. Снабжен ли ваш класс приложений аннотациями @HiltAndroidApp ?

2. Можете ли вы добавить свою onCreate функцию в вопрос?

3. Мое приложение-hiltandroidapp, и мое приложение on create только добавляет слушателя сейчас

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

Ответ №1:

Вы на самом деле предоставляете свой SimpleExoPlayer объект ServiceComponent . Поскольку вы ожидаете ввести действие SimpleExoPlayer in, вам следует ActivityComponent вместо этого ввести его. Я думаю, что вам может понадобиться модуль или повторно использовать существующий

 @Module @InstallIn(ActivityComponent::class) class ActivityModule {    @ActivityScoped  @Provides  fun provideExoPlayer(  @ApplicationContext context: Context,  audioAttributes: AudioAttributes  ) = SimpleExoPlayer.Builder(context).build().apply {  setAudioAttributes(audioAttributes, true)  setHandleAudioBecomingNoisy(true)  } }  

Комментарии:

1. Я попытался изменить компонент ServiceComponent на ApplicationComponent, но это не работает, я все равно получил ошибку : экзОплаер свойства lateinit не был инициализирован

2. просто заметил, что вы использовали объект, как насчет использования класса вместо модуля