Есть ли более безопасный способ получить активность в JetPack Compose?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Есть ли более безопасный способ получить активность в JetPack Compose?

Сообщение Anonymous »

Я создал класс, который действует как менеджер для обработки рекламы в моем приложении JetPack Compose, класс выглядит следующим образом: < /p>

Код: Выделить всё

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 () 
, но способ прохождения его в JetPack Compose - это выполнение следующего каскада : < /p>
val activity = LocalContext.current as Activity
< /code>
Из того, что я прочитал, это не самый рекомендуемый способ сделать это, и я хотел бы знать, есть ли лучший способ передать деятельность или улучшить мой класс в другом способ, о котором я не думал.


Подробнее здесь: https://stackoverflow.com/questions/769 ... ck-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»