💡Tips
- Before calling any ad API, make sure
McSdk.initialize()has completed initialization; otherwise the call will be ignored- It is recommended to set up the Listener and load ads as early as possible at app launch to ensure ads are ready when you need to show them
onAdReceivedRewardCallbackis the only reliable timing to grant rewards — always handle reward logic in this callback- The SDK has built-in exponential backoff retry logic on load failure to avoid frequent requests that may reduce fill rate
const String _adUnitId = "your mediation unit id";
int _retryAttempt = 0;
void initRewardedAd() {
McSdk.setRewardedAdListener(McRewardedAdListener(
onAdLoadedCallback: (McAd ad) {
// Ad loaded successfully, reset retry count
_retryAttempt = 0;
},
onAdLoadFailedCallback: (String adUnitId, McError error) {
// Ad failed to load, retry with exponential backoff
_retryAttempt++;
if (_retryAttempt >= 3) {
return;
}
final delaySeconds = pow(2, min(3, _retryAttempt)).toInt();
Future.delayed(Duration(seconds: delaySeconds), () {
McSdk.loadRewardedAd(_adUnitId);
});
},
onAdDisplayedCallback: (McAd ad) {
// Ad displayed successfully, preload next ad
McSdk.loadRewardedAd(_adUnitId);
},
onAdDisplayFailedCallback: (McAd ad, McError error) {
// Ad failed to display, reload
McSdk.loadRewardedAd(_adUnitId);
},
onAdClickedCallback: (McAd ad) {
// User clicked the ad
},
onAdHiddenCallback: (McAd ad) {
// Ad closed, preload next ad
McSdk.loadRewardedAd(_adUnitId);
},
onAdRevenuePaidCallback: (McAd ad) {
// Ad revenue callback
},
onAdLoadFinishedCallback: (String adUnitId) {
// Current load round finished (fires regardless of success or failure)
},
onAdReceivedRewardCallback: (McAd ad, McReward reward) {
// ⚠️ User completed the reward, grant reward here
// reward.amount — reward quantity (int)
// reward.label — reward type (String)
print("Reward type: ${reward.label} x ${reward.amount}");
},
onAdFailedToReceivedRewardCallback: (McAd ad) {
// Callback when reward grant fails
},
));
// Initiate load request
McSdk.loadRewardedAd(_adUnitId);
}
Future<void> showRewardedAd() async {
final isReady = await McSdk.isRewardedAdReady(_adUnitId);
if (isReady == true) {
McSdk.showRewardedAd(_adUnitId);
} else {
McSdk.loadRewardedAd(_adUnitId);
}
}
// Set Extra Parameter, only for Max
McSdk.setRewardedAdExtraParameter(_adUnitId, "key", "value");
// Set Local Extra Parameter
McSdk.setRewardedAdLocalExtraParameter(_adUnitId, "key", value);
// Parameters must be set before loadRewardedAd() and apply to all subsequent load requests