Flutter 颤振Admob';调用setState时s小部件获取错误
我对Admob的小部件有问题。 我正在为包含Admob banner小部件的Flitter应用程序开发一个新功能。 但当我设置另一个小部件的值时,Admob小部件会出错 我正在使用:谷歌移动广告:^0.11.0+1 横幅是这样建造的:Flutter 颤振Admob';调用setState时s小部件获取错误,flutter,set,admob,state,Flutter,Set,Admob,State,我对Admob的小部件有问题。 我正在为包含Admob banner小部件的Flitter应用程序开发一个新功能。 但当我设置另一个小部件的值时,Admob小部件会出错 我正在使用:谷歌移动广告:^0.11.0+1 横幅是这样建造的: @override void initState() { setState(() { _adBanner = createBannerAd(); }); super.initState(); } @overri
@override
void initState() {
setState(() {
_adBanner = createBannerAd();
});
super.initState();
}
@override
void dispose() {
_adBanner.dispose();
super.dispose();
}
小部件显示如下:
Container(
margin: EdgeInsets.only(bottom: myPercent(2, screenHeight)),
child: FutureBuilder(
future: _adBanner.load(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Container(
margin: EdgeInsets.only(bottom: 3),
width: myPercent(95, screenWidth),
height: myPercent(6, screenHeight),
alignment: Alignment.center,
child: AdWidget(
ad: _adBanner,
),
);
}
return Container();
}),
日志错误捕获:
颤振:点击
颤振:══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
颤振:在构建AdWidget时抛出以下断言(脏,状态:_AdWidgetState#a1afb):
颤振:这个AdWidget已经在Widget树中了
颤振:如果将此AdWidget放入列表中,请确保在生成器函数中创建一个新实例
颤振:一个独特的广告对象。
颤振:确保在多个AdWidget中没有使用相同的广告对象。
颤振:
颤振:导致错误的相关小部件是:
颤振:AdWidgetfile:///Users/sofian/Work/Personal/Mobile/WhatUDo/what_u_do/lib/views/idea.dart:295:34
颤振:
颤振:抛出异常时,这是堆栈:
flatter:#0_AdWidgetState.build(包:google_mobile_ads/src/ad_containers.dart:372:7)
flatter:#1 StatefulElement.build(包:flatter/src/widgets/framework.dart:4825:27)
flatter:#2 ComponentElement.performRebuild(包:flatter/src/widgets/framework.dart:4708:15)
flatter:#3 StatefulElement.performRebuild(包:flatter/src/widgets/framework.dart:4880:11)
flatter:#4 BuildOwner._与CurrentBuildTarget一起运行(包:flatter/src/widgets/framework.dart:2708:15)
flatter:#5 Element.rebuild(包:flatter/src/widgets/framework.dart:4407:12)
flatter:#6 ComponentElement._firstBuild(包:flatter/src/widgets/framework.dart:4687:5)
flatter:#7 StatefulElement._firstBuild(包:flatter/src/widgets/framework.dart:4871:11)
flatter:#8 ComponentElement.mount(包:flatter/src/widgets/framework.dart:4682:5)
颤振:。。。正常元件安装(10个机架)
flatter:#18 Element.inflateWidget(包:flatter/src/widgets/framework.dart:3660:14)
flatter:#19 Element.updateChild(包:flatter/src/widgets/framework.dart:3422:20)
flatter:#20 ComponentElement.performRebuild(包:flatter/src/widgets/framework.dart:4733:16)
flatter:#21 BuildOwner._与CurrentBuildTarget一起运行(包:flatter/src/widgets/framework.dart:2708:15)
flatter:#22 Element.rebuild(包:flatter/src/widgets/framework.dart:4407:12)
flatter:#23 statelement.update(包:flatter/src/widgets/framework.dart:4789:5)
flatter:#24 Element.updateChild(包:flatter/src/widgets/framework.dart:3412:15)
flatter:#25 ComponentElement.performRebuild(包:flatter/src/widgets/framework.dart:4733:16)
flatter:#26 stateflement.performRebuild(包:flatter/src/widgets/framework.dart:4880:11)
flatter:#27 BuildOwner._与CurrentBuildTarget一起运行(包:flatter/src/widgets/framework.dart:2708:15)
flatter:#28 Element.rebuild(包:flatter/src/widgets/framework.dart:4407:12)
flatter:#29 BuildOwner.buildScope(包:flatter/src/widgets/framework.dart:2813:33)
flatter:#30 WidgetsBinding.drawFrame(包:flatter/src/widgets/binding.dart:899:21)
颤振:31渲染器绑定。_handlePersistentFrameCallback(包:颤振/src/rendering/binding.dart:320:5)
flatter:#32 SchedulerBinding._invokeFrameCallback(包:flatter/src/scheduler/binding.dart:1119:15)
颤振:33 SchedulerBinding.handleDrawFrame(包:颤振/src/scheduler/binding.dart:1057:9)
颤振:#34调度绑定。"手持绘图框架(包:颤振/src/scheduler/binding.dart:973:5)
颤振:#38(dart:ui/hooks.dart:157:10)
颤振:#39平台调度程序。_绘图框(dart:ui/平台调度程序。dart:253:5)
颤振:#40(省道:ui/挂钩.省道:120:31)
颤振:(从dart中删除3帧:异步)
从问题和错误日志来看,似乎您正在尝试使用
setState
刷新屏幕/小部件,但不是实际的基于广告的容器小部件-仍然会出现此错误
如果我理解正确的话。。然后,问题是关于ad小部件试图使用旧的ad对象在setState
调用上重建,但它希望每次新构建时都有新的ad对象。因此,如果不需要的话,请避免此类小部件构建
创建一个seprate基于广告的容器小部件,如AppXyzAdWidget
,将广告的父容器代码和其他与广告相关的代码移动到新的小部件中,并在屏幕上使用新创建的基于广告的小部件
通过这种方式,您可以在没有广告相关内容的情况下将屏幕解耦,然后在
设置状态之后,将不会重新加载广告,他们的小部件只会刷新您的内容。从问题和错误日志中,似乎您正在尝试使用setState
刷新屏幕/小部件,但不是实际的基于广告的容器小部件-仍然会出现此错误
如果我理解正确的话。。然后,问题是关于ad小部件试图使用旧的ad对象在setState
调用上重建,但它希望每次新构建时都有新的ad对象。因此,如果不需要的话,请避免此类小部件构建
创建一个seprate基于广告的容器小部件,如AppXyzAdWidget
,将广告的父容器代码和其他与广告相关的代码移动到新的小部件中,并在屏幕上使用新创建的基于广告的小部件
通过这种方式,您可以在没有广告相关内容的情况下分离屏幕,然后,setState
将不会重新加载广告,他们的小部件只会刷新您的内容。调用setState()
会导致小部件重新构建,因此您的FutureBuilder()
小部件将再次触发未来任务。这就是为什么你会看到它
// ...
// Some code
@override
void initState() {
setState(() {
_adBanner = createBannerAd();
});
_adBanner.load().whenComplete(() {
if (this.mounted) {
setState(() {
_showAdBanner = true;
});
}
});
super.initState();
}
@override
void dispose() {
_adBanner.dispose();
super.dispose();
}
// ...
// Some code
bool _showAdBanner = false;
// ...
// Some code
_showAdBanner
? Container(
margin: EdgeInsets.only(bottom: 3),
width: myPercent(95, screenWidth),
height: myPercent(6, screenHeight),
alignment: Alignment.center,
child: AdWidget(
ad: _adBanner,
),
)
: Container()
// ...
// Some code
@override
Widget build(BuildContext context) {
_adBanner = createBannerAd();
return Container(
margin: EdgeInsets.only(bottom: myPercent(2, screenHeight)),
child: FutureBuilder(
future: _adBanner.load(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Container(
margin: EdgeInsets.only(bottom: 3),
width: myPercent(95, screenWidth),
height: myPercent(6, screenHeight),
alignment: Alignment.center,
child: AdWidget(
ad: _adBanner,
),
);
}
return Container();
});
}