所以我在列表中插入了admob广告。我在列表视图中添加了无限滚动功能。所以当用户滚动到列表末尾时,新的项目会添加到列表中。有了这些项目,我也会在列表中添加admob广告。
所以当用户滚动到最后,新的项目和广告被添加到列表中。这时,下面的异常被捕获。那么如何解决这个异常。
======== Exception caught by widgets library =======================================================
The following assertion was thrown building AdWidget-[#53ef3](dirty, state: _AdWidgetState#850ac):
This AdWidget is already in the Widget tree
If you placed this AdWidget in a list, make sure you create a new instance in the builder function with a unique ad object.
Make sure you are not using the same ad object in more than one AdWidget.
The relevant error-causing widget was:
AdWidget-[#53ef3] file:///D:/flutter%20project/memer/lib/pages/TimeLinePage.dart:198:42
When the exception was thrown, this was the stack:
#0 _AdWidgetState.build (package:google_mobile_ads/src/ad_containers.dart:371:7)
#1 StatefulElement.build (package:flutter/src/widgets/framework.dart:4612:27)
#2 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4495:15)
#3 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4667:11)
#4 Element.rebuild (package:flutter/src/widgets/framework.dart:4189:5)
代码:-
return ListView.builder(itemBuilder: (context, index){
//print(posts);
if(posts[index] is Post){
return posts[index];
}
else{
final Container adContainer = Container(
alignment: Alignment.center,
child: AdWidget(key: UniqueKey(), ad: posts[index] as BannerAd),//AdmobService.createBannerAd()..load()
height: 50,
);
return adContainer;
}
},itemCount: posts.length,
controller: scrollController,physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()));
}
9条答案
按热度按时间dldeef671#
除了Kafil Khan的answer之外,还可以使用
StatefulBuilder
Package Container小部件。示例:
vdgimpew2#
问题是你一次又一次地放同一个小部件。你可以通过创建一个新的
StatefulWidget
类并返回Adwidget来修复这个问题,这将多次构建同一个小部件,它的工作原理就像一个Builder。这解决了我的问题,希望它也能为你工作!:)你也不必为一个广告单元提供多个id。
wqnecbli3#
Step-1:创建一个有状态的类,如下所示:
步骤-2:按如下所示使用:
5kgi1eie4#
当您要添加新横幅时,必须为其分配一个新ID:
正如错误日志中明确指出的:
如果您将此AdWidget放在列表中,请确保在生成器函数中使用唯一的广告对象创建一个新示例。请确保未在多个AdWidget中使用同一广告对象。
mrphzbgm5#
我尝试了所有这些方法,但只有以下方法对我有效:我在每个页面上添加了
myBanner.dispose()
到iniState
。prdp8dxp6#
就像上面的answer一样,我将把我的实现放在这里,让未来的新手更容易。
首先,让我们创建一个名为ad_helper的helper类来隐藏UI中的所有内容,它包含两个helper方法:
第一个方法是buildBannerWidget,这是一个公共方法,用于根据需要构建广告小工具。
第二个方法是_instantiateBanner,这是一个私有方法,用于在每次调用buildBannerWidget方法时构建bannerAd对象。
第二步是在我们的用户界面将是我们的小部件:
vxbzzdmp7#
您必须像这样使用UniqueKey
ujv3wf0j8#
以上没有任何工作对我来说。**在我的情况下,显示三个广告在同一个列表中,我不得不创建3个独立的变量来加载3个独立的AdWidegt。见所附的代码有一个近似值来解决这个问题。**注意:解决了我们讨论的错误,我现在有一个未解决的性能问题,横幅时,内存被删除,每次横幅从屏幕上消失,因为滚动。这股力量重建和处置每次滚动发生...
55ooxyrt9#
向每个包含
AdWidget
的SizedBox
(或其他小部件)添加唯一的key
确实解决了我的问题。您必须在initState()方法中初始化并加载广告。
下面是我如何使用横幅广告键作为小部件的唯一键。