Flutter 颤振Admob';调用setState时s小部件获取错误

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

我对Admob的小部件有问题。 我正在为包含Admob banner小部件的Flitter应用程序开发一个新功能。 但当我设置另一个小部件的值时,Admob小部件会出错

我正在使用:谷歌移动广告:^0.11.0+1

横幅是这样建造的:

  @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();
        });
  }