我收到一個錯誤,我的 BannerAd 變數未初始化并且我的應用程式崩潰,所以我將我的 _banner 移動到代碼頂部但仍然無法作業,我將它移動到狀態類中并且仍然沒有初始化應該需要做什么來初始化?
class _MyHomePageState extends State<MyHomePage> {
late BannerAd _banner;
@override
void didChangeDependencies(){
super.didChangeDependencies();
final adState = context.read(adStateProvider);
adState.initialization.then((value)
{
setState(() {
_banner = BannerAd(size: AdSize.banner, adUnitId: adState.bannerAdUniteId, listener: adState.adListener, request: AdRequest())..load();
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text('pub'),
if(_banner == null)Text('null hhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
else Expanded(child: AdWidget(ad: _banner),),
uj5u.com熱心網友回復:
那是因為您的小部件在初始化之前構建_banner,即使您在 中初始化它initState,仍然無法作業,因為您在未來完成后初始化它,并且未來在構建方法執行后完成。所以這里的解決方案是洗掉late之前的關鍵字BannerAd并使其可以為空。像這樣:
// this doesn't give you any initialization errors
// because _banner will have a default value of null
BannerAd? _banner;
現在您將遇到不同的問題,因為AdWidget需要一個非空物件,您需要_banner使用空斷言運算子斷言該物件不為空!,如下所示:
AdWidget(ad: _banner!)
這樣,就好像您在告訴編譯器“我確定 _banner 不為空”,因為您僅在_banner由于if else子句不為空時才構建此小部件
請注意,使用 時!,您必須完全確定該物件實際上不會為空,如果為空,則會拋出空斷言例外。
您可以使用此飛鏢代碼實驗室閱讀和練習空安全性
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/454195.html
