#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. просто заметил, что вы использовали объект, как насчет использования класса вместо модуля