【问题标题】:The argument type 'BannerAd?' can't be assigned to the parameter type 'AdWithView'参数类型“横幅广告?”无法分配给参数类型“AdWithView”
【发布时间】:2022-01-09 08:51:45
【问题描述】:

我将我的应用程序升级到了 Flutter 2,并使所有内容都为 null 安全。 之后,我在实现谷歌移动广告 SDK 时遇到错误。 我遵循了所有文档,据此,尽管文档没有更新,但我不应该收到此错误。 这是我尝试实现广告的代码。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:book_rent_app_chapter3/model/order.dart';
import 'package:book_rent_app_chapter3/provider/user.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';


class OrdersScreen extends StatefulWidget {
  OrdersScreen({Key? key}) : super(key: key);

  @override
  State<OrdersScreen> createState() => _OrdersScreenState();
}

class _OrdersScreenState extends State<OrdersScreen> {
  BannerAd? _bannerAd;

  @override
  void initState() {
    super.initState();
    _bannerAd = BannerAd(
      adUnitId: BannerAd.testAdUnitId,
      request: AdRequest(),
      size: AdSize.banner,
      listener: BannerAdListener(
        onAdLoaded: (Ad ad) {
          print('$BannerAd loaded.');
        },
        onAdFailedToLoad: (Ad ad, LoadAdError error) {
          print('$BannerAd failedToLoad: $error');
        },
        onAdOpened: (Ad ad) => print('$BannerAd onAdOpened.'),
        onAdClosed: (Ad ad) => print('$BannerAd onAdClosed.'),
      ),
    );

    _bannerAd?.load();
  }

  @override
  void dispose() {
    super.dispose();
    _bannerAd?.dispose();
    _bannerAd = null;
  }

  @override
  Widget build(BuildContext context) {
    final userProvider = Provider.of<UserProvider>(context);
    return Scaffold(
      appBar: AppBar(
        iconTheme: const IconThemeData(color: Colors.black),
        backgroundColor: Colors.white,
        elevation: 0.0,
        title:
        const Text(
            "Orders", style: TextStyle(fontSize: 18, color: Colors.black)),
        leading: IconButton(
            icon: const Icon(Icons.close),
            onPressed: () {
              Navigator.pop(context);
            }),
      ),
      backgroundColor: Colors.white,
      body: Column(
        children:[ ListView.builder(
            itemCount: userProvider.orders.length,
            itemBuilder: (_, index) {
              OrderModel _order = userProvider.orders[index];
              return ListTile(
                leading: Text(
                  "\$${_order.total}",
                  style: const TextStyle(fontSize: 15, color: Colors.black),
                ),
                title: Text(_order.description),
                subtitle: Text(
                    DateTime.fromMillisecondsSinceEpoch(_order.createdAt)
                        .toString()),
                trailing: Text(_order.status,
                    style: const TextStyle(fontSize: 18, color: Colors.black)),
              );
            }),
          Container(
            alignment: Alignment.center,
            child: AdWidget(ad: _bannerAd),
            width: _bannerAd?.size.width.toDouble(),
            height: _bannerAd?.size.height.toDouble(),
          )
        ]
      ),
    );
  }
}

我遇到的错误在一行

    child: AdWidget(ad: _bannerAd),

错误是:

The argument type 'BannerAd?' can't be assigned to the parameter type 'AdWithView'. 

尽管根据文档,我应该如何实现它。 请帮助:)这是一个项目 谢谢:)

【问题讨论】:

    标签: flutter dart-null-safety googlemobileads firebase-admob flutter2.0


    【解决方案1】:

    您的代码的问题很简单,广告可以为空,这意味着您不能只将其分配到小部件广告中,因为如果它为空就会给您一个错误。

    查看您的代码,您的广告只会在 initstate 之前或 dispose 方法之后为空,因此在构建期间您应该不会对空广告有任何问题,如果是这种情况,您可以放心地使用! 来告诉您飞镖广告不为空:

    child: AdWidget(ad: _bannerAd!),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-18
      • 2016-08-10
      • 2022-12-24
      • 2023-02-10
      • 2021-07-09
      • 2021-08-22
      • 2021-11-03
      • 2022-08-14
      相关资源
      最近更新 更多