mnemo_cards/lib/features/yandex_ads/yandex_ads.dart

129 lines
3.7 KiB
Dart
Raw Normal View History

2024-07-27 13:13:42 +00:00
import 'dart:async';
2024-05-22 20:48:44 +00:00
import 'dart:developer';
2024-08-03 22:37:10 +00:00
import 'package:auto_route/auto_route.dart';
2024-05-22 20:48:44 +00:00
import 'package:flutter/widgets.dart';
2024-08-03 22:37:10 +00:00
import 'package:mnemo_cards/domain/router/dialogs.dart';
2024-05-22 20:48:44 +00:00
import 'package:yandex_mobileads/mobile_ads.dart';
2024-08-03 22:37:10 +00:00
import '../../main.dart';
2024-05-22 20:48:44 +00:00
class YandexAds {
static BannerAd createBanner(
BoxConstraints constraints, {
2024-07-24 23:35:38 +00:00
required String id,
2024-05-22 20:48:44 +00:00
String? key,
2024-07-27 13:13:42 +00:00
VoidCallback? onLoaded,
2024-05-22 20:48:44 +00:00
}) {
return BannerAd(
adUnitId: id,
// or 'demo-banner-yandex'
adSize: BannerAdSize.inline(
width: constraints.maxWidth.round(),
maxHeight: constraints.maxHeight.round(),
),
adRequest: const AdRequest(),
onAdLoaded: () {
log('Loaded $key');
onLoaded?.call();
},
onAdFailedToLoad: (error) {
// Ad failed to load with AdRequestError.
// Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
},
onAdClicked: () {
// Called when a click is recorded for an ad.
},
onLeftApplication: () {
// Called when user is about to leave application (e.g., to go to the browser), as a result of clicking on the ad.
},
onReturnedToApplication: () {
// Called when user returned to application after click.
},
onImpression: (impressionData) {
// Called when an impression is recorded for an ad.
});
}
2024-07-27 13:13:42 +00:00
static RewardedAd? _preloadedAd;
2024-08-03 22:37:10 +00:00
static Completer? _showingAdCompleter;
2024-07-27 13:13:42 +00:00
static Future<RewardedAd?> loadRewardedAd() async {
final completer = Completer<RewardedAd?>();
final _rewardedAdLoader = await RewardedAdLoader.create(
onAdLoaded: (RewardedAd rewardedAd) {
_preloadedAd = rewardedAd;
completer.complete(rewardedAd);
},
onAdFailedToLoad: (error) {
completer.complete(null);
},
);
await _rewardedAdLoader.loadAd(
adRequestConfiguration: AdRequestConfiguration(
adUnitId: 'R-M-3761037-1',
),
);
return completer.future;
}
static Future<bool> showRewardedAd(
Function(Reward reward) onRewarded, {
maxAttempts = 2,
}) async {
2024-08-03 22:37:10 +00:00
if (_showingAdCompleter?.isCompleted == false) {
return false;
2024-07-27 13:13:42 +00:00
}
2024-08-03 22:37:10 +00:00
try {
_showingAdCompleter = Completer();
if (_preloadedAd == null) {
// final dialogCompleter = Completer();
// final dialogFuture =
// showErrorDialog('Загрузка...', completer: dialogCompleter);
try {
final _loadedAd = await loadRewardedAd().timeout(
Duration(seconds: 5),
);
if (_loadedAd == null) {
return false;
}
} finally {}
// dialogCompleter.complete();
// await dialogFuture;
// final frameCompleter = Completer();
// WidgetsBinding.instance.addPostFrameCallback((_) {
// frameCompleter.complete();
// });
// await frameCompleter;
2024-07-27 13:13:42 +00:00
}
2024-08-03 22:37:10 +00:00
final _ad = _preloadedAd;
_preloadedAd = null;
await _ad?.setAdEventListener(
eventListener: RewardedAdEventListener(
onAdDismissed: () {
_ad.destroy();
},
onAdFailedToShow: (e) {
_ad.destroy();
if (maxAttempts-- > 0) {
showRewardedAd(onRewarded, maxAttempts: maxAttempts);
}
},
onAdShown: () {
// _ad.destroy();
},
onRewarded: (r) {
onRewarded(r);
_ad.destroy();
},
),
);
await _ad?.show();
final reward = await _ad?.waitForDismiss();
return reward != null;
} finally {
_showingAdCompleter?.complete();
}
2024-07-27 13:13:42 +00:00
}
2024-05-22 20:48:44 +00:00
}