Как внедрить контекст Android в функции верхнего уровня

У меня есть служебные функции как функции верхнего уровня, и некоторые из них нуждаются в контексте. Эти функции используются в моделях просмотра.

В настоящее время у меня есть ссылка на контекст в пользовательском классе приложения и я использую его из служебных функций, и теперь я хочу интегрировать инъекцию зависимостей (Hilt, но способ кинжала 2 должен быть аналогичным)

Итак, я предполагаю, что мне нужно создать что-то вроде ApplicationContextModule и ввести Context, но мне интересно, где я должен вводить Context.

Должен ли я внедрять контекст в модели просмотра, использующие служебные функции? или мне следует ввести его напрямую в функцию верхнего уровня (я даже не уверен, могу ли я еще внедрить его в функцию верхнего уровня)?


person Dave    schedule 02.12.2020    source источник


Ответы (2)


Вы не должны использовать контекст в ViewModel, вместо этого используйте Application:

DaggerAppComponent:

@Component(modules = [YourModule::class])
interface AppComponent {

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance app: Application): AppComponent
    }
}

Класс приложения:

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        component = DaggerAppComponent.factory().create(this)
    }

    companion object {
        lateinit var component: AppComponent
            private set
    }
}

Манитфест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="project">

    <application
        android:name=".App">

    </application>

</manifest>

ViewModel (или любой другой класс, который вы вводите рукоятью или кинжалом):

class YourViewModel @Inject constructor(
    private val app: Application
) : ViewModel() {

   // code
   
}
person Alesh17    schedule 02.12.2020

Шаг 1

@EntryPoint
@InstallIn(SingletonComponent::class)
interface OkHttpClientEntryPoint {
    fun provideOkHttpClient(): OkHttpClient
}

шаг 2

 val okHttpClient: OkHttpClient = EntryPointAccessors.fromApplication(appContext, OkHttpClientEntryPoint::class.java).provideOkHttpClient()
person العبد    schedule 10.03.2021