Код: Выделить всё
class InterstitialAdManager(private val context: Context) {
private var mInterstitialAd: InterstitialAd? = null
private var lastLoadedUnitAd: String? = null
init {
loadInterstitial()
}
private fun loadInterstitial() {
InterstitialAd.load(
context,
lastLoadedUnitAd.orEmpty(),
AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(adError: LoadAdError) {
mInterstitialAd = null
}
override fun onAdLoaded(interstitialAd: InterstitialAd) {
mInterstitialAd = interstitialAd
}
}
)
}
fun showInterstitial(
onAdDismissed: () -> Unit = {},
onAdShowedFullScreen: () -> Unit = {}
) {
val activity = context.findActivity()
if (mInterstitialAd != null && activity != null) {
mInterstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdFailedToShowFullScreenContent(e: AdError) {
mInterstitialAd = null
onAdDismissed()
}
override fun onAdDismissedFullScreenContent() {
mInterstitialAd = null
loadInterstitial()
onAdDismissed()
}
override fun onAdShowedFullScreenContent() {
onAdShowedFullScreen()
}
}
mInterstitialAd?.show(activity)
} else {
onAdDismissed()
}
}
fun removeInterstitial() {
mInterstitialAd?.fullScreenContentCallback = null
mInterstitialAd = null
}
fun setAdUnit(unitAd: String) {
lastLoadedUnitAd = unitAd
loadInterstitial()
}
private fun Context.findActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null
}
}
< /code>
Когда я использовал XML, все было хорошо, у меня не было проблем с использованием этого класса. Проблема в том, что использовать его с помощью JetPack Compose и внедрить его с помощью рукояти, я делаю это следующим образом. У меня есть класс, который хранит состояние в mutablestateof Код: Выделить всё
data class DetailState(
val interstitialAdManager: InterstitialAdManager? = null,
val currentDesign: Design? = null
)
< /code>
Это состояние обрабатывается в ViewModel: < /p>
@HiltViewModel
class DetailViewModel @Inject constructor(interstitialAdManager: InterstitialAdManager,
) : ViewModel() {
var state by mutableStateOf(DetailState())
private set
init {
state = state.copy(interstitialAdManager = interstitialAdManager)
state.interstitialAdManager?.setAdUnit("hidden_unit_ad")
}
< /code>
Я создал модуль рукояти для создания сети инъекций: < /p>
@Module
@InstallIn(SingletonComponent::class)
class AdsModule {
@Provides
@Singleton
fun interstitialAdManagerProvider(@ApplicationContext context: Context) =
InterstitialAdManager(context)
}
< /code>
В чем проблема? Контекст, который я ввожу, является контекстом приложения, которое предлагает мне, поэтому метод, который у меня есть в классе моего менеджера, не может найти деятельность в этом контексте. Моя первая мысль-сделать следующее: < /p>
@Module
@InstallIn(ActivityComponent::class)
class AdsModule {
@Provides
@ActivityScoped
fun interstitialAdManagerProvider(@ActivityContext context: Context) =
InterstitialAdManager(context)
}
< /code>
Проблема в том, что, как я показал выше, я вводил менеджера в ViewModel, поэтому узел дает мне ошибку компиляции. Другое решение, и это единственное, что сработало для меня, состоит в том, чтобы передать деятельность в качестве параметра в методе ShowInterstitial () val activity = LocalContext.current as Activity
< /code>
Из того, что я прочитал, это не самый рекомендуемый способ сделать это, и я хотел бы знать, есть ли лучший способ передать деятельность или улучшить мой класс в другом способ, о котором я не думал.
Подробнее здесь: https://stackoverflow.com/questions/769 ... ck-compose
Мобильная версия