Flutter Admob 的 widget 在调用 setState 时出现错误

bul*_*ast 5 state set admob flutter

我的 Admob 小部件有问题。\n我正在为包含 Admob 横幅小部件的 flutter 应用程序开发一项新功能。\n但是当我 setState 另一个小部件的值时,Admob 小部件会出错。

\n

我在用 :google_mobile_ads: ^0.11.0+1

\n

横幅的构建方式如下:

\n
      @override\n      void initState() {\n        setState(() {\n          _adBanner = createBannerAd();\n        });\n        super.initState();\n      }\n\n      @override\n      void dispose() {\n        _adBanner.dispose();\n        super.dispose();\n      }\n
Run Code Online (Sandbox Code Playgroud)\n

小部件的显示如下:

\n
    Container(\n        margin: EdgeInsets.only(bottom: myPercent(2, screenHeight)),\n        child: FutureBuilder(\n            future: _adBanner.load(),\n            builder: (context, snapshot) {\n              if (snapshot.connectionState == ConnectionState.done) {\n                return Container(\n                  margin: EdgeInsets.only(bottom: 3),\n                  width: myPercent(95, screenWidth),\n                  height: myPercent(6, screenHeight),\n                  alignment: Alignment.center,\n                  child: AdWidget(\n                    ad: _adBanner,\n                  ),\n                );\n              }\n              return Container();\n            }),\n
Run Code Online (Sandbox Code Playgroud)\n

日志错误捕获:

\n
    flutter: click\n    flutter: \xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1 EXCEPTION CAUGHT BY WIDGETS LIBRARY   \xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nflutter: The following assertion was thrown building AdWidget(dirty, state: _AdWidgetState#a1afb):\nflutter: This AdWidget is already in the Widget tree\nflutter: If you placed this AdWidget in a list, make sure you create a new instance in the builder function\nflutter: with a unique ad object.\nflutter: Make sure you are not using the same ad object in more than one AdWidget.\nflutter:\nflutter: The relevant error-causing widget was:\nflutter:   AdWidget file:///Users/sofian/Work/Personal/Mobile/WhatUDo/what_u_do/lib/views/idea.dart:295:34\nflutter:\nflutter: When the exception was thrown, this was the stack:\nflutter: #0      _AdWidgetState.build (package:google_mobile_ads/src/ad_containers.dart:372:7)\nflutter: #1      StatefulElement.build (package:flutter/src/widgets/framework.dart:4825:27)\nflutter: #2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4708:15)\nflutter: #3      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4880:11)\nflutter: #4      BuildOwner._runWithCurrentBuildTarget (package:flutter/src/widgets/framework.dart:2708:15)\nflutter: #5      Element.rebuild (package:flutter/src/widgets/framework.dart:4407:12)\nflutter: #6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4687:5)\nflutter: #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4871:11)\nflutter: #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4682:5)\nflutter: ...     Normal element mounting (10 frames)\nflutter: #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3660:14)\nflutter: #19     Element.updateChild (package:flutter/src/widgets/framework.dart:3422:20)\nflutter: #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4733:16)\nflutter: #21     BuildOwner._runWithCurrentBuildTarget (package:flutter/src/widgets/framework.dart:2708:15)\nflutter: #22     Element.rebuild (package:flutter/src/widgets/framework.dart:4407:12)\nflutter: #23     StatelessElement.update (package:flutter/src/widgets/framework.dart:4789:5)\nflutter: #24     Element.updateChild (package:flutter/src/widgets/framework.dart:3412:15)\nflutter: #25     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4733:16)\nflutter: #26     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4880:11)\nflutter: #27     BuildOwner._runWithCurrentBuildTarget (package:flutter/src/widgets/framework.dart:2708:15)\nflutter: #28     Element.rebuild (package:flutter/src/widgets/framework.dart:4407:12)\nflutter: #29     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2813:33)\nflutter: #30     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:899:21)\nflutter: #31     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:320:5)\nflutter: #32     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1119:15)\nflutter: #33     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1057:9)\nflutter: #34     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:973:5)\nflutter: #38     _invoke (dart:ui/hooks.dart:157:10)\nflutter: #39     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:253:5)\nflutter: #40     _drawFrame (dart:ui/hooks.dart:120:31)\nflutter: (elided 3 frames from dart:async)\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

Jig*_*tel 0

从问题和错误日志来看,似乎您正在尝试使用setState而不是实际的基于广告的容器小部件来刷新屏幕/小部件 - 您仍然收到此错误。

如果我理解正确..那么问题是关于广告小部件正在尝试setState使用较旧的广告对象进行调用重建,但每次新构建时它都期望新的广告对象。因此,如果不需要,请避免构建此类小部件。

创建一个单独的基于广告的容器小部件AppXyzAdWidget,并将广告的父容器代码和其他广告相关代码移动到新小部件内,并在屏幕上使用新创建的基于广告的小部件。

通过这种方式,您可以将屏幕解耦,而无需与广告相关的内容,然后setState就不会重新加载您的广告,并且它们的小部件只会刷新您的内容。