# Flutter 的间隙集成

> 使用 Unity LevelPlay SDK 在 Flutter app 中集成全屏插页式广告服务，支持静态和视频格式。

LevelPlay Interstitial 是一个全屏广告单元，通常在 app 生命周期中的自然过渡点投放。Unity 支持静态和视频插页。

> **Note:**
>
> 本文档与 SDK 8.4.0+ 相关。

## 先决条件##prerequisites

* 确保已将 LevelPlay Flutter 插件正确[集成](/grow/levelplay/sdk/flutter/plugin-integration.md)到 app 中。
* 确保使用 LevelPlay Initialization API 初始化 SDK。
* 在 LevelPlay 后台中找到 AdUnitID。

## 创建 Interstitial 并注册到事件##create-interstitial-and-register-to-events

在收到 `onInitSuccess` 回调后创建 interstitial 对象。

LevelPlay SDK 会触发多个事件来通知您的 Interstitial 活动。要接收这些事件，请注册广告单元的监听器。确保在初始化 SDK 之前设置监听器以防止任何信息丢失。

```dart
final LevelPlayInterstitialAd _interstitialAd = LevelPlayInterstitialAd(adUnitId: [YOUR_AD_UNIT]);

@override
void initState() {
    super.initState();
    _interstitialAd.setListener(this);
}
```

## 设置 Interstitial 监听器##set-interstitial-listener

在代码中实现这些`LevelPlayInterstitialAdListener`，以便了解广告投放情况。

* 建议的最佳做法是在加载插页式广告之前设置监听器。
* 每个插页式广告必须有自己的监听器实现。
* 回调在主线程上运行。

```dart
  @override
  void onAdLoaded(LevelPlayAdInfo adInfo) {
    // Provided when the ad is successfully loaded
  }
  @override
  void onAdLoadFailed(LevelPlayAdError error) {
    // Provided when the ad fails to load.包含广告单元信息
  }
  @override
  void onAdDisplayed(LevelPlayAdInfo adInfo) {
    // Provided when the ad is displayed.这相当于展示
  }
  @override
  void onAdDisplayFailed(LevelPlayAdError error, LevelPlayAdInfo adInfo) {
    // Provided when the ad fails to be displayed
  }
  
  @override
  void onAdClicked(LevelPlayAdInfo adInfo) {
    // Provided when the user clicks on the ad
  }
  @override
  void onAdClosed(LevelPlayAdInfo adInfo) {
    // Provided when the ad is closed
  }
  @override
  void onAdInfoChanged(LevelPlayAdInfo adInfo) {
    // Provided when the ad info is updated.加载另一个广告后可用，并且包含更高的 CPM/速率
  }
```

## 加载 Interstitial Ad##load-interstitial-ad

要加载插页式广告，请使用 `loadAd`。

```dart
_interstitialAd.loadAd();
```

## 显示插页式广告##show-interstitial-ad

在收到`onAdLoaded`回调后，使用 `showAd` 显示插页式广告。

* 共享 **Activity** 是必需的。 
* 如果使用放置，请在 **showAd** API 中通道放置/位置名称，如下文 Placements 部分所示。
* 广告成功展示给用户后，可以通过重复加载步骤加载另一个广告。 

```dart
// Show ad without placement 
_interstitialAd.showAd(); 
// Show ad with placement 
_interstitialAd.showAd(placement: [YOUR_PLACEMENT]);
```

### 检查 Ad is Ready##check-ad-is-ready

为了避免广告展示失败并确保广告正常运行，建议的最佳做法是在调用 `showAd` API 之前使用以下 API：

* `isAdReady`：如果广告已成功加载并且广告单元未设置上限，则返回 true，否则返回 false。

* `isPlacementCapped`：限制有效放置/位置时返回 true。如果放置/位置无效或未设置上限，此 API 将返回 false。

```dart
// Check that ad is ready and that the placement is not capped 
if(_interstitialAd.isAdReady() && !LevelPlayInterstitialAd.isPlacementCapped([YOUR_PLACEMENT])) { 
    _interstitialAd.showAd(placement:[YOUR_PLACEMENT]); 
}
```

### 广告位##placements

Unity 支持在 LevelPlay 控制面板上设置插页的[广告位](/grow/levelplay/platform/settings/placements.md)节奏和上限。 

如果为插页式广告服务设置了位置，请调用 `showAd` 方法为指定的放置/位置提供广告。

```dart
// Check that ad is ready and that the placement is not capped 
if(_interstitialAd.isAdReady() && !LevelPlayInterstitialAd.isPlacementCapped([YOUR_PLACEMENT])) { 
    _interstitialAd.showAd(placement:[YOUR_PLACEMENT]); 
}
```

## 插页式广告服务的完整实现示例##full-implementation-example-of-interstitial-ads

```dart
// Start of the widget...
final LevelPlayInterstitialAd _interstitialAd = LevelPlayInterstitialAd(adUnitId:'YOUR_AD_UNIT_ID');
  @override
  void initState() {
    super.initState();
    _interstitialAd.setListener(this);
    _interstitialAd.loadAd();
  }
  @override
  void onAdClicked(LevelPlayAdInfo adInfo) {
    // Implement your logic here...
  }
  @override
  void onAdClosed(LevelPlayAdInfo adInfo) {
    // Implement your logic here...
  }
  @override
  void onAdDisplayFailed(LevelPlayAdError error, LevelPlayAdInfo adInfo) {
    // Implement your logic here...
  }
  @override
  void onAdDisplayed(LevelPlayAdInfo adInfo) {
    // Implement your logic here...
  }
  @override
  void onAdInfoChanged(LevelPlayAdInfo adInfo) {
    // Implement your logic here...
  }
  @override
  void onAdLoadFailed(LevelPlayAdError error) {
    // Implement your logic here...
  }
  @override
  void onAdLoaded(LevelPlayAdInfo adInfo) {
    // Implement your logic here, for example showing the ad
    _interstitialAd.showAd();
  }
  // Rest of the widget
  // End of widget...
```

## LevelPlay Mediation 演示应用程序##levelplay-mediation-demo-app

Integration Demo 应用程序演示了如何在 app 中集成插页式广告单元 API。

[下载 Flutter Demo 应用程序](https://github.com/ironsource-mobile/Flutter-SDK/tree/master/example)

验证与 [Integration Test Suite](/grow/levelplay/sdk/flutter/integration-test-suite/.md) 的集成。

## 后续步骤##next-steps

请遵循 Flutter 集成指南来集成其他插页式广告网络或配置其他广告格式：

* [添加聚合网络](/grow/levelplay/sdk/flutter/mediation-networks.md)
* [奖励广告服务](/grow/levelplay/sdk/flutter/rewarded-ads-integration.md)
* [横幅广告服务](/grow/levelplay/sdk/flutter/banner-integration.md)
* [原生广告服务](/grow/levelplay/sdk/flutter/native-ads-integration.md)
