主题
信息流滑动位 —— NovvyScrollAd
内联信息流广告,渲染为原生视图插入可滚动列表。生命周期:load() → 嵌入 NovvyScrollAdView → setPlaying(true/false) 驱动播放 → destroy()。
可选 episodeNumber 覆盖该广告归属的集号(如第 1 集播放时预载第 2 集的广告);非空时优先于 setContentContext 的 episode。
对接流程
本集开始播放
↓
NovvyAds.setContentContext(...) // series/episode
↓
NovvyScrollAd(adUnitId, episodeNumber) + load()
↓
onAdLoaded // 就绪(或 onAdFailedToLoad)
↓
嵌入 NovvyScrollAdView(onPlatformViewCreated 时自动 attach)
↓
划入 setPlaying(true) → onAdShowed / 划走 setPlaying(false)
↓
组件卸载自动 detach(不 destroy)
↓
宿主手动 ad.destroy() // 释放原生实例 / 素材类成员
| 成员 | 说明 |
|---|---|
episodeNumber | int? 构造参数,覆盖 bid 请求中的集号 |
onAdShowed | 广告进入视口可见 |
onAdHidden | 广告移出视口 / 隐藏 |
onAdPlaybackTick | void Function(int remainingSeconds)?,每秒回调剩余锁定秒数(0 = 可划走) |
attach({int? durationSeconds, bool useDefaultSwipeOverlay = true}) | 挂载到平台视图容器(通常由 NovvyScrollAdView 自动调用) |
detach() | 从容器移除 |
setPlaying(bool playing) | 划入视口 true、划出 false |
attach() 参数:
durationSeconds:划走解锁的等待时长(原生会 clamp 到最小值)。useDefaultSwipeOverlay:是否显示 SDK 内置「Swipe to skip」提示条;设为false可自行基于onAdPlaybackTick绘制 UI。
示例
dart
final ad = NovvyScrollAd(adUnitId: 'your_ad_unit_id', episodeNumber: 2);
ad.onAdLoaded = () {
ad.setPlaying(true); // 当前 item 在视口内
setState(() => _ready = true);
};
ad.onAdHidden = () { /* 隐藏 */ };
ad.onAdPlaybackTick = (remaining) { /* 更新自定义倒计时 UI */ };
ad.onAdFailedToLoad = (e) => ad.destroy();
ad.load();嵌入组件(放在期望高度的 SizedBox 内):
dart
if (_ready)
NovvyScrollAdView(ad: ad),
NovvyScrollAdView在平台视图创建时自动attach,在组件dispose时自动detach。宿主仍需在广告结束后调用ad.destroy()释放实例。
事件回调
除基类回调 onAdLoaded / onAdFailedToLoad 外,本类型的独有回调:
| 回调 | 触发时机 |
|---|---|
onAdShowed | 广告挂载展示、曝光上报完成 |
onAdHidden | 广告从容器移除 / 隐藏 |
onAdPlaybackTick(remainingSeconds) | 每秒回调剩余锁定秒数(0 = 可划走) |
onAdFailedToLoad(error) 的 error 取值见错误类型。回调统一在主 isolate(UI 线程) 触发。