Flutter广告集成插件nestads的使用

Flutter广告集成插件nestads的使用

NestAds Flutter SDK 是一个用于广告追踪及日志收集的SDK。

本文档将指导你如何安装及使用NestAds Flutter SDK。


准备

要求条件

  • Flutter 3.24.0 及以上版本
  • Dart 3.5.0 及以上版本
  • iOS 14.0 及以上版本
  • 最小SDK版本: 23 (Android 6.0 Marshmallow)
  • 目标SDK版本: 34 (Android 14)

依赖项

NestAds Flutter SDK 使用以下库:

  • sdk: flutter
  • package_info_plus: ^8.1.2
  • crypto: ^3.0.6
  • convert: ^3.0.1
  • encrypt: ^5.0.0
  • archive: ^4.0.2
  • http: ^1.1.2
  • timezone: ^0.9.2

安装

步骤1: 在pubspec.yaml文件中添加依赖项

pubspec.yaml文件的dependencies下添加以下内容:

dependencies:
  nestads: [最新版本]

也可以在终端输入以下命令来添加依赖项:

flutter pub add nestads

步骤2: 获取依赖包

在终端输入以下命令来获取依赖包:

flutter pub get

使用方法

现在可以在Dart代码中导入并使用NestAds了。

import 'package:nestads/nestads.dart';

初始化

main()函数中调用NestAds.instance.initialize()方法进行初始化。初始化时必须提供userIddeviceInfo(包含osName, deviceBrand, deviceModel)。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化时提供userId和deviceInfo
  await NestAds.instance.initialize(
    userId: '6fbfb26a-fdff-40ff-9722-269def2e72ad',
    deviceInfo: {
      'osName': 'Android',
      'deviceBrand': 'samsung',
      'deviceModel': 'SM-S926N',
    },
  );

  // 设置跟踪日志选项
  NestAds.instance.setTrackingLogOptions(size: 10, duration: 5);

  runApp(SampleApp());
}

设置跟踪日志选项

可以使用NestAds.instance.setTrackingLogOptions()方法设置日志存储的最大数量和时间间隔。如果未调用该方法,则默认为10条日志,存储时间为5秒。

void setTrackingLogOptions() {
  NestAds.instance.setTrackingLogOptions(size: 10, duration: 5);
}

事件追踪

使用NestAds.instance.sendTrackingLog()方法进行事件追踪。

必须参数
  • type: 日志类型
  • eventId: 日志事件ID
  • placementId: 广告位ID
可选参数
  • misc: 包含的其他信息
  • requestId: 请求ID
  • impressionOrder: 实际曝光顺序

注意:requestIdmisc.requestId中至少有一个必须存在。

示例代码
void trackEvent() {
  // 处理来自排名者的响应
  NestAds.instance.sendTrackingLog(
    type: 'VIEW',
    eventId: event['event_id'],
    placementId: event['placement_id'],
    misc: event['misc'],
  );

  // 处理非排名者的响应
  NestAds.instance.sendTrackingLog(
    type: 'VIEW',
    requestId: event['request_id'],
    eventId: event['event_id'],
    placementId: event['placement_id'],
  );
}

示例代码

import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
import 'package:visibility_detector/visibility_detector.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化时提供userId和deviceInfo
  await NestAds.instance.initialize(
    userId: '6fbfb26a-fdff-40ff-9722-269def2e72ad',
    deviceInfo: {
      'osName': 'Android',
      'deviceBrand': 'samsung',
      'deviceModel': 'SM-S926N',
    },
  );

  // 设置跟踪日志选项
  NestAds.instance.setTrackingLogOptions(size: 10, duration: 5);

  runApp(SampleApp());
}

class SampleApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('NestAds')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => AdsPage()),
            );
          },
          child: Text('进入广告页面'),
        ),
      ),
    );
  }
}

class AdsPage extends StatelessWidget {
  final List<Map<String, dynamic>> events = List.generate(
    100,
    (index) {
      return {
        'request_id': index.toString(),
        'event_id': index.toString(),
        'placement_id': index.toString(),
        "impression_order": index + 1,
        'misc': {
          "request_id": index.toString(),
          "impression_order": index + 1,
          "model_version": "v1"
        }
      };
    },
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('广告事件页面')),
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          childAspectRatio: 1.0,
          mainAxisSpacing: 50.0,
        ),
        itemCount: events.length,
        itemBuilder: (context, index) {
          final event = events[index];
          return VisibilityDetector(
            key: Key('ad-${event['event_id']}'),
            onVisibilityChanged: (visibilityInfo) {
              if (visibilityInfo.visibleFraction >= 0.5) {
                if (index < 50) {
                  // 处理来自排名者的响应
                  NestAds.instance.sendTrackingLog(
                    type: 'VIEW',
                    eventId: event['event_id'],
                    placementId: event['placement_id'],
                    misc: event['misc'],
                  );
                } else {
                  // 处理非排名者的响应
                  NestAds.instance.sendTrackingLog(
                      type: 'VIEW',
                      requestId: event['request_id'],
                      eventId: event['event_id'],
                      placementId: event['placement_id'],
                      impressionOrder: event['impression_order']);
                }
              }
            },
            child: GestureDetector(
              onTap: () {
                // 点击事件处理
                if (index < 50) {
                  // 处理来自排名者的响应
                  NestAds.instance.sendTrackingLog(
                      type: 'ENTER',
                      eventId: event['event_id'],
                      placementId: event['placement_id'],
                      misc: event['misc']);
                } else {
                  // 处理非排名者的响应
                  NestAds.instance.sendTrackingLog(
                      type: 'ENTER',
                      requestId: event['request_id'],
                      eventId: event['event_id'],
                      placementId: event['placement_id'],
                      impressionOrder: event['impression_order']);
                }
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => AdDetailPage(event: event)),
                );
              },
              child: Container(
                margin: EdgeInsets.all(8.0),
                color: Colors.blueAccent,
                child: Center(
                  child: Text(
                    '事件 \n${event['event_id']}',
                    style: TextStyle(color: Colors.white, fontSize: 20),
                  ),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

class AdDetailPage extends StatelessWidget {
  final Map<String, dynamic> event;

  AdDetailPage({required this.event});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('广告详情页')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              '事件 ${event['event_id']} \n',
              style: TextStyle(fontSize: 24),
              textAlign: TextAlign.center,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                int eventId = int.parse(event['event_id']);
                // 处理INPROGRESS事件
                if (eventId < 50) {
                  // 处理来自排名者的响应
                  NestAds.instance.sendTrackingLog(
                    type: 'INPROGRESS',
                    eventId: event['event_id'],
                    placementId: event['placement_id'],
                    misc: event['misc'],
                  );
                } else {
                  // 处理非排名者的响应
                  NestAds.instance.sendTrackingLog(
                      type: 'INPROGRESS',
                      requestId: event['request_id'],
                      eventId: event['event_id'],
                      placementId: event['placement_id'],
                      impressionOrder: event['impression_order']);
                }
              },
              child: Text('参与INPROGRESS'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                int eventId = int.parse(event['event_id']);
                // 处理COMPLETE事件
                if (eventId < 50) {
                  // 处理来自排名者的响应
                  NestAds.instance.sendTrackingLog(
                    type: 'COMPLETE',
                    eventId: event['event_id'],
                    placementId: event['placement_id'],
                    misc: event['misc'],
                  );
                } else {
                  // 处理非排名者的响应
                  NestAds.instance.sendTrackingLog(
                      type: 'COMPLETE',
                      requestId: event['request_id'],
                      eventId: event['event_id'],
                      placementId: event['placement_id'],
                      impressionOrder: event['impression_order']);
                }
              },
              child: Text('领取COMPLETE奖励'),
            ),
          ],
        ),
      ),
    );
  }
}
1 回复

更多关于Flutter广告集成插件nestads的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


nestads 是一个用于在 Flutter 应用中集成广告的插件。它支持多种广告格式,包括横幅广告、插页式广告、原生广告和激励视频广告。以下是如何在 Flutter 项目中使用 nestads 插件的简要指南。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 nestads 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  nestads: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化 nestads

在应用启动时,你需要初始化 nestads 插件。通常,你可以在 main.dart 文件中进行初始化。

import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await NestAds.initialize(
    appId: 'your_app_id', // 替换为你的应用ID
    isTestMode: true, // 测试模式,发布时设置为 false
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 显示横幅广告

你可以在应用的任何地方显示横幅广告。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Column(
        children: [
          Expanded(
            child: Center(
              child: Text('Hello, world!'),
            ),
          ),
          NestBannerAd(
            adUnitId: 'your_banner_ad_unit_id', // 替换为你的横幅广告单元ID
            adSize: AdSize.banner,
          ),
        ],
      ),
    );
  }
}

4. 显示插页式广告

插页式广告通常在用户完成某些操作后显示。以下是如何加载和显示插页式广告的示例:

import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  NestInterstitialAd? _interstitialAd;

  void _loadInterstitialAd() {
    NestInterstitialAd.load(
      adUnitId: 'your_interstitial_ad_unit_id', // 替换为你的插页式广告单元ID
      request: AdRequest(),
      adLoadCallback: NestInterstitialAdLoadCallback(
        onAdLoaded: (ad) {
          setState(() {
            _interstitialAd = ad;
          });
        },
        onAdFailedToLoad: (error) {
          print('InterstitialAd failed to load: $error');
        },
      ),
    );
  }

  void _showInterstitialAd() {
    if (_interstitialAd != null) {
      _interstitialAd!.show();
    } else {
      print('InterstitialAd is not ready yet.');
    }
  }

  @override
  void initState() {
    super.initState();
    _loadInterstitialAd();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _showInterstitialAd,
          child: Text('Show Interstitial Ad'),
        ),
      ),
    );
  }
}

5. 显示激励视频广告

激励视频广告通常用于奖励用户观看完整视频。以下是如何加载和显示激励视频广告的示例:

import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  NestRewardedAd? _rewardedAd;

  void _loadRewardedAd() {
    NestRewardedAd.load(
      adUnitId: 'your_rewarded_ad_unit_id', // 替换为你的激励视频广告单元ID
      request: AdRequest(),
      rewardedAdLoadCallback: NestRewardedAdLoadCallback(
        onAdLoaded: (ad) {
          setState(() {
            _rewardedAd = ad;
          });
        },
        onAdFailedToLoad: (error) {
          print('RewardedAd failed to load: $error');
        },
      ),
    );
  }

  void _showRewardedAd() {
    if (_rewardedAd != null) {
      _rewardedAd!.show(
        onUserEarnedReward: (RewardItem reward) {
          print('User earned reward: ${reward.amount} ${reward.type}');
        },
      );
    } else {
      print('RewardedAd is not ready yet.');
    }
  }

  @override
  void initState() {
    super.initState();
    _loadRewardedAd();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _showRewardedAd,
          child: Text('Show Rewarded Ad'),
        ),
      ),
    );
  }
}

6. 显示原生广告

原生广告允许你自定义广告的外观,使其与应用的设计风格一致。以下是如何加载和显示原生广告的示例:

import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: NestNativeAd(
          adUnitId: 'your_native_ad_unit_id', // 替换为你的原生广告单元ID
          factoryId: 'your_factory_id', // 替换为你的原生广告工厂ID
          request: AdRequest(),
          listener: NativeAdListener(
            onAdLoaded: (ad) {
              print('NativeAd loaded');
            },
            onAdFailedToLoad: (error) {
              print('NativeAd failed to load: $error');
            },
          ),
        ),
      ),
    );
  }
}

7. 处理生命周期

为了确保广告正确地加载和显示,你需要在应用的生命周期中处理广告的状态。例如,在 dispose 方法中释放广告资源。

@override
void dispose() {
  _interstitialAd?.dispose();
  _rewardedAd?.dispose();
  super.dispose();
}

8. 测试模式

在开发和测试阶段,建议启用测试模式以确保广告不会对真实用户展示。你可以在初始化 nestads 时设置 isTestModetrue

await NestAds.initialize(
  appId: 'your_app_id',
  isTestMode: true,
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!