调用 setState 时 Flutter Admob 的小部件出错

标签 flutter set admob state

我对 Admob 的小部件有问题。
我正在为包含 Admob 横幅小部件的 Flutter 应用程序开发一项新功能。
但是当我 setState 另一个小部件的值时,Admob 小部件会出错。
我正在使用:google_mobile_ads: ^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();
            }),
日志错误捕获:
    flutter: click
    flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY   ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building AdWidget(dirty, state: _AdWidgetState#a1afb):
flutter: This AdWidget is already in the Widget tree
flutter: If you placed this AdWidget in a list, make sure you create a new instance in the builder function
flutter: with a unique ad object.
flutter: Make sure you are not using the same ad object in more than one AdWidget.
flutter:
flutter: The relevant error-causing widget was:
flutter:   AdWidget file:///Users/sofian/Work/Personal/Mobile/WhatUDo/what_u_do/lib/views/idea.dart:295:34
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      _AdWidgetState.build (package:google_mobile_ads/src/ad_containers.dart:372:7)
flutter: #1      StatefulElement.build (package:flutter/src/widgets/framework.dart:4825:27)
flutter: #2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4708:15)
flutter: #3      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4880:11)
flutter: #4      BuildOwner._runWithCurrentBuildTarget (package:flutter/src/widgets/framework.dart:2708:15)
flutter: #5      Element.rebuild (package:flutter/src/widgets/framework.dart:4407:12)
flutter: #6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4687:5)
flutter: #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4871:11)
flutter: #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4682:5)
flutter: ...     Normal element mounting (10 frames)
flutter: #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3660:14)
flutter: #19     Element.updateChild (package:flutter/src/widgets/framework.dart:3422:20)
flutter: #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4733:16)
flutter: #21     BuildOwner._runWithCurrentBuildTarget (package:flutter/src/widgets/framework.dart:2708:15)
flutter: #22     Element.rebuild (package:flutter/src/widgets/framework.dart:4407:12)
flutter: #23     StatelessElement.update (package:flutter/src/widgets/framework.dart:4789:5)
flutter: #24     Element.updateChild (package:flutter/src/widgets/framework.dart:3412:15)
flutter: #25     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4733:16)
flutter: #26     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4880:11)
flutter: #27     BuildOwner._runWithCurrentBuildTarget (package:flutter/src/widgets/framework.dart:2708:15)
flutter: #28     Element.rebuild (package:flutter/src/widgets/framework.dart:4407:12)
flutter: #29     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2813:33)
flutter: #30     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:899:21)
flutter: #31     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:320:5)
flutter: #32     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1119:15)
flutter: #33     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1057:9)
flutter: #34     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:973:5)
flutter: #38     _invoke (dart:ui/hooks.dart:157:10)
flutter: #39     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:253:5)
flutter: #40     _drawFrame (dart:ui/hooks.dart:120:31)
flutter: (elided 3 frames from dart:async)
enter image description here

最佳答案

从问题和错误日志来看,您似乎正在尝试使用 setState 来刷新屏幕/小部件但不是实际的基于广告的容器小部件 - 您仍然收到此错误。
如果我理解正确.. 那么问题是关于广告小部件试图在 setState 上重建使用旧的广告对象调用,但每次新建时都期望新的广告对象。因此,如果不需要,请避免构建此类小部件。
创建一个单独的基于广告的容器小部件,如 AppXyzAdWidget并将广告的父容器代码和其他与广告相关的代码移动到新小部件内,并在屏幕上使用新创建的基于广告的小部件。
通过这种方式,您可以在没有广告相关内容的情况下分离屏幕,然后在 setState 之后不会重新加载您的广告及其小部件,只会刷新您的内容。

关于调用 setState 时 Flutter Admob 的小部件出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66644543/

相关文章:

dart - 如何将图像背景分配给 flutter 中的列

flutter - 如何将底部导航项与停靠的晶圆厂完美对齐?

android-studio - android studio 中的 flutter 说找不到要转到的声明......我正在使用它的最新版本 v1.7.8+hotfix.4

python - python中三组的交集?

dart - 我无法运行我的 flutter 应用程序。它说 Flutter 需要 Android SDK 28,而我有 sdk 28

一个集合的所有可能集合列表的算法

java - 无法解析方法 findViewById();添加admob时

适用于 Objective-c 的 IOS Admob 插页式广告

android - Admob Interstitial 匹配请求太低 (~10%)

c++ - 内存泄漏 - STL 集