flutter - 无法在 listView.builder 中显示原生广告?

标签 flutter dart admob native-ads googlemobileads

 Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  final initFuture = MobileAds.instance.initialize();
  final adState = Adv(initFuture);

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);
  initScreen = await Authenticate().readStorage('initScreen');
  print(initScreen);
  await Authenticate().writeStorage('initScreen', "true");

  runApp(MyApp(
    appRouter: AppRouter(),
    connectivity: Connectivity(),
    drawerBloc: DrawerBloc(DrawerState(NavItem.homepage)),
  ));
}

这是我的main.dart代码

    import 'dart:io';

import 'package:google_mobile_ads/google_mobile_ads.dart';

class Adv {
  Future<InitializationStatus> initialization;

  Adv(this.initialization);

  static String get categoriesNativeAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/6300978111';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/2934735716';
    }
    throw new UnsupportedError("Unsupported platform");
  }

  static String get homeNativeAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/2247696110';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/3986624511';
    }
    throw new UnsupportedError("Unsupported platform");
  }

  static String get newsPageNativeAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/2247696110';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/3986624511';
    }
    throw new UnsupportedError("Unsupported platform");
  }

  static String get blogsBannerAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/2247696110';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/3986624511';
    }
    throw new UnsupportedError("Unsupported platform");
  }

  static String get publisherListPageNativeAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/2247696110';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/3986624511';
    }
    throw new UnsupportedError("Unsupported platform");
  }

  
}

这是我的 adhelper.dart 的代码

     class ShowHomeNews extends StatefulWidget {
  final List<NewsModel> newsModel;
  final int index;
  const ShowHomeNews({
    Key key,
    @required this.newsModel,
    this.index,
  }) : super(key: key);

  @override
  _ShowHomeNewsState createState() => _ShowHomeNewsState();
}

class _ShowHomeNewsState extends State<ShowHomeNews> {
  int adCountTrack = 0;

  bool _isAdLoaded = false;
  List<NativeAd> adList = [];
  @override
  void initState() {
    super.initState();
    adLoader();
  }

  adLoader() {
    setState(() {
      int len = ((widget.newsModel.length) / 4).floor();
      for (int i = 0; i < len; i++) {
        print(i.toString());
        print("i ki vaues:" + i.toString());
        adList.add(
          NativeAd(
              adUnitId: Adv.homeNativeAdUnitId,
              factoryId: 'listTile',
              listener: AdListener(
                onAdLoaded: (_) {
                  setState(() {
                    _isAdLoaded = true;
                  });
                },
                onAdFailedToLoad: (ad, error) {
                  // Releases an ad resource when it fails to load

                  print(
                      'Ad load failed (code=${error.code} message=${error.message})');
                },
              ),
              request: AdRequest())
            ..load(),
        );
      }
    });

    print("AdList size: " + adList.length.toString());
  }

  @override
  Widget build(BuildContext context) {
    return RefreshIndicator(
      onRefresh: () async => BlocProvider.of<TabbarblocBloc>(context).add(
        PageTapped(index: widget.index),
      ),
      child: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Padding(
              padding: const EdgeInsets.fromLTRB(10, 5, 10, 0),
              child: Text(
                "Trending",
                style: TextStyle(fontWeight: FontWeight.w600),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Container(
                height: 200,
                child: ListView.builder(
                  physics: ClampingScrollPhysics(),
                  primary: false,
                  itemCount: widget.newsModel.length,
                  shrinkWrap: true,
                  scrollDirection: Axis.horizontal,
                  itemBuilder: (context, index) {
                    return TrendingTile(
                      newsModel: widget.newsModel[index],
                    );
                  },
                ),
              ),
            ),
            Container(
              child: ListView.builder(
                  primary: false,
                  itemCount: widget.newsModel.length,
                  shrinkWrap: true,
                  itemBuilder: (context, index) {
                    print(widget.newsModel.length);
                    if (index % 4 == 0 && adCountTrack < adList.length) {
                      return Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Container(
                          height: 120.0,
                          width: 120.0,
                          decoration: BoxDecoration(
                            color: whiteTextColor,
                            borderRadius: BorderRadius.circular(12),
                            boxShadow: [
                              BoxShadow(
                                  spreadRadius: 1,
                                  blurRadius: 5.0, // soften the shadow
                                  offset: Offset(
                                    1.0, // Move to right 10  horizontally
                                    2.0, // Move to bottom 10 Vertically
                                  ),
                                  color: Colors.grey[350])
                            ],
                          ),
                          child: AdWidget(
                            ad: adList[adCountTrack++],
                          ),
                        ),
                      );
                    } else if (widget.newsModel[index].views <=
                        compareTotalViewForGrid) {
                      return Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: NewsTileSmall(
                          newsModel: widget.newsModel[index],
                        ),
                      );
                    } else {
                      return Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: NewsTileBig(
                          newsModel: widget.newsModel[index],
                        ),
                      );
                    }
                  }),
            ),
          ],
        ),
      ),
    );
  }
}

这是我的文件代码,我在其中尝试在列表中显示原生广告,但没有原生广告。显示。

下面我添加了调试控制台日志

D/DynamitePackage(19276): Instantiating com.google.android.gms.ads.ChimeraAdLoaderBuilderCreatorImpl I/Ads
(19276): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("FA6C491A794C3455DA1F640FE2E82C3A")) to get test ads on this device. I/DynamiteModule(19276): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:210890500 I/DynamiteModule(19276): Selected remote version of com.google.android.gms.ads.dynamite, version >= 210890500 W/Parcel (19276): **** enforceInterface() expected 'com.google.android.gms.ads.clearcut.IClearcut' but read 'com.google.android.gms.gass.internal.clearcut.IClearcut' I/DynamiteModule(19276): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:210890500 I/DynamiteModule(19276): Selected remote version of com.google.android.gms.ads.dynamite, version >= 210890500 I/DynamiteModule(19276): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:210890500 I/DynamiteModule(19276): Selected remote version of com.google.android.gms.ads.dynamite, version >= 210890500 W/Parcel (19276): **** enforceInterface() expected 'com.google.android.gms.ads.clearcut.IClearcut' but read 'com.google.android.gms.gass.internal.clearcut.IClearcut' I/AudioManager(19276): In isSpeakerphoneOn(), calling application: com.indiary.indiary D/DynamitePackage(19276): Instantiating com.google.android.gms.ads.ChimeraAdLoaderBuilderCreatorImpl I/Ads
(19276): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("FA6C491A794C3455DA1F640FE2E82C3A")) to get test ads on this device. I/AudioManager(19276): In isSpeakerphoneOn(), calling application: com.indiary.indiary I/flutter (19276): 26 D/DynamitePackage(19276): Instantiating com.google.android.gms.ads.ChimeraAdLoaderBuilderCreatorImpl I/Ads
(19276): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("FA6C491A794C3455DA1F640FE2E82C3A")) to get test ads on this device. I/AudioManager(19276): In isSpeakerphoneOn(), calling application: com.indiary.indiary D/DynamitePackage(19276): Instantiating com.google.android.gms.ads.ChimeraAdLoaderBuilderCreatorImpl /Ads
(19276): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("FA6C491A794C3455DA1F640FE2E82C3A")) to get test ads on this device. I/AudioManager(19276): In isSpeakerphoneOn(), calling application: com.indiary.indiary 2 I/flutter (19276): 26 D/DynamitePackage(19276): Instantiating com.google.android.gms.ads.ChimeraAdLoaderBuilderCreatorImpl I/Ads
(19276): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("FA6C491A794C3455DA1F640FE2E82C3A")) to get test ads on this device. I/flutter (19276): 26 I/AudioManager(19276): In isSpeakerphoneOn(), calling application: com.indiary.indiary D/DynamitePackage(19276): Instantiating com.google.android.gms.ads.ChimeraAdLoaderBuilderCreatorImpl I/Ads
(19276): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("FA6C491A794C3455DA1F640FE2E82C3A")) to get test ads on this device. I/AudioManager(19276): In isSpeakerphoneOn(), calling application: com.indiary.indiary W/pool-30-thread-(19276): type=1400 audit(0.0:6476): avc: granted { execute } for path="/data/data/com.indiary.indiary/app_pccache/5/CCFA22EBAF6E1880534512380E8EF01170FD9593/pcam.jar" dev="dm-14" ino=5090217 scontext=u:r:untrusted_app:s0:c250,c257,c512,c768 tcontext=u:object_r:app_data_file:s0:c250,c257,c512,c768 tclass=file app=com.indiary.indiary 7 I/flutter (19276): 26 E/flutter (19276): [ERROR:flutter/shell/platform/android/platform_view_android_jni_impl.cc(49)] java.lang.IllegalStateException: PlatformView#getView() returned null, but an Android view reference was expected. E/flutter (19276): at io.flutter.plugin.platform.PlatformViewsController.initializePlatformViewIfNeeded(PlatformViewsController.java:717) E/flutter (19276): at io.flutter.plugin.platform.PlatformViewsController.onDisplayPlatformView(PlatformViewsController.java:746) E/flutter (19276): at io.flutter.embedding.engine.FlutterJNI.onDisplayPlatformView(FlutterJNI.java:1195) E/flutter (19276): at android.os.MessageQueue.nativePollOnce(Native Method) E/flutter (19276): at android.os.MessageQueue.next(MessageQueue.java:335) E/flutter (19276): at android.os.Looper.loop(Looper.java:183) E/flutter (19276): at android.app.ActivityThread.main(ActivityThread.java:8010) E/flutter (19276): at java.lang.reflect.Method.invoke(Native Method) E/flutter (19276): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631) E/flutter (19276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978) E/flutter (19276): F/flutter (19276): [FATAL:flutter/shell/platform/android/platform_view_android_jni_impl.cc(1395)] Check failed: CheckException(env). F/libc (19276): Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 19276 (indiary.indiary), pid 19276 (indiary.indiary)

我尝试使用 google_mobile_ads sdk 显示谷歌原生广告,我想在列表之间显示 n 个广告,就像在每 4 个项目原生广告应该显示之后一样,但我无法显示它们,我的应用程序崩溃了?

最佳答案

改变

List<Object> adList;

对此:

List<NativeAd> adList = [];

由于您收到空错误,这意味着您正在尝试将 NativeAd 对象添加到您的列表中,但它仍未初始化。

关于flutter - 无法在 listView.builder 中显示原生广告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67345072/

相关文章:

android - C++ 的 JNI admob 事件监听器

ios - Swift iOS -Admob 如何判断用户是否是加州居民,为加州消费者隐私法案(CCPA)做准备

flutter - Riverpod/Flutter 在消费者类中使用 showDialog

android - "Tried to send a platform message to Flutter, but FlutterJNI was detached from native C++."启动后台服务并关闭应用后

android-studio - 缺少泛型类型 'MaterialPageRoute<dynamic>' 的类型参数(Flutter)

Dart pub 更新失败

dart - 如何用固定大小的网格填充背景颜色

ios - Flutter firebase_admob 在默认应用安装的 iOS 上不工作

android - 在 alpha/beta 测试中使用真正的 AdMob 广告

firebase - 如何从 Firebase 实时数据库 Flutter 解析对象列表