Как внедрить контекст приложения в репозиторий с помощью Hilt?

Я хочу внедрить контекст приложения в класс репозитория, чтобы создать экземпляр базы данных комнаты внутри репозитория. Я использую Hilt для внедрения зависимостей.

Можем ли мы использовать рукоять для передачи контекста приложения или мне придется передавать его вручную?

Я получаю следующую ошибку:

[Dagger/MissingBinding] android.content.Context cannot be provided without an
@Provides-annotated method. public abstract static class ApplicationC 
implements ExartApplication_GeneratedInjector

Ошибка контекста


person Tushar    schedule 24.07.2020    source источник
comment
Изображения и скриншоты могут быть хорошим дополнением к сообщению, но убедитесь, что пост по-прежнему понятен и полезен без них. Если вы публикуете изображения кода или сообщения об ошибках, убедитесь, что вы также скопировали и вставили или набрали фактический код / ​​сообщение непосредственно в сообщение. См. Почему я не могу загружать изображения кода на SO, когда задаю вопрос? - к сообщениям об ошибках применяются те же аргументы, что и хорошо. Сообщения, в которых требуемый текстовый контент присутствует только в изображениях, скорее всего, будут закрыты из-за недостатка деталей.   -  person Ryan M    schedule 28.07.2020
comment
Эй ... Ты можешь принять мой ответ, если это помогло .. ?? Я бы очень помог :)   -  person Ashu    schedule 20.08.2020


Ответы (1)


Просто используйте аннотацию @ApplicationContext к параметру контекста.

Аннотируя контекст с помощью @ApplicationContext, предоставленного Hilt, нам не нужно создавать поставщика для контекста приложения.

import dagger.hilt.android.qualifiers.ApplicationContext

/* For hilt versions lower than v2.28.2 use ApplicationComponent instead of
SingletonComponent. ApplicationComponent is deprecated and even removed in 
some versions above v2.28.2 so better refactor it to SingletonComponent. */


@Module
@InstallIn(SingletonComponent::class)
class ProductionModule {

    @Singleton
    @Provides
    fun provideAppDatabase(@ApplicationContext appContext: Context): AppDatabase {
        return Room
            .databaseBuilder(appContext, AppDatabase::class.java, AppDatabase.DB_NAME)
            .build()
    }
}

ПРИМЕЧАНИЕ. Если у вас возникнет соблазн передать контекст активности в качестве зависимости, попробуйте использовать контекст приложения или переосмыслите свой вариант использования. Передача контекста активности может привести к серьезным последствиям, таким как утечка памяти. При этом, если вы знаете, что делаете, используйте аннотацию @ActivityContext для передачи контекста активности. Возможным вариантом использования могут быть адаптеры.

person Ashu    schedule 27.07.2020
comment
Есть ли способ аннотировать ActivityContext? - person Arul Mani; 11.08.2020
comment
Спас меня день! - person Dimitri de Jesus; 16.08.2020
comment
@ArulMani, если вам нужно ввести контекст активности, возможно, вы что-то делаете не так. ActivityContext - хрупкая вещь, и я не думаю, что ее следует вводить небрежно. - person Ashu; 19.08.2020
comment
@Ashu Есть ли способ выполнить инъекцию контекста в поле? - person Rissmon Suresh; 20.11.2020
comment
@RissmonSuresh, можете ли вы объяснить свой вариант использования? Обычно вы предпочитаете использовать инъекцию конструктора. - person Ashu; 23.11.2020
comment
@Ashu Просто интересно узнать о доступе к контексту (любому объекту) через внедрение поля. Раньше я использовал Koin для DI, и внедрение поля можно реализовать следующим образом: stackoverflow.com/a/49629378/4247543 - person Rissmon Suresh; 23.11.2020
comment
@RissmonSuresh @Inject lateinit var... для закачки поля. Для получения дополнительной информации обратитесь к документации: developer.android.com/training/dependency- инъекция / - person Ashu; 26.11.2020
comment
по умолчанию модули Applicationcomponent предоставляют одноэлементную область видимости согласно developer.android.com/training/dependency -injection / Приложение ApplicationComponent @Singleton - person Mohd Faizan; 20.01.2021
comment
@MohdFaizan Я не совсем понял, о чем вы. Вы можете пояснить, о чем говорите? - person Ashu; 22.01.2021