我把我的应用程序升级到了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'.
虽然根据文档,这就是我应该如何实现它。
1条答案
按热度按时间hrirmatl1#
你的代码的问题很简单,广告是空的,这意味着你不能只是把它分配到一个小部件广告,因为它会给予你一个错误,如果它是空的。
看看你的代码,你的ad只在initState之前或dispose方法之后为null,所以你在构建过程中应该不会遇到null ad的问题,如果是这样的话,你可以安全地使用
!
告诉dart ad不是null: