最近,我把我的Ffltter应用程序从AdMob_Ffltter移植到了Google_Mobile_Ads.我已经根据教程here成功地实现了横幅广告.这些广告看起来与预期不谋而合,但它们会导致应用程序的其余部分等待加载,就好像有人在等待什么.以下是问题的直观描述:

no banner (expected behaviour)

with banner (buggy)

当我想要加载包含多个小部件的页面时,延迟就更糟糕了.起初,我认为这是因为该应用程序是在模拟器上运行的,然而,这种现象在安装了更新操作系统的实体手机上也存在.我发现了this个问题,并认为这可能是相关的,然而使用建议的程序包不起作用,而且同样的问题也出现在更新的Android版本(>10)上.这是我的广告课:

class AnchoredAdaptiveBanner extends StatefulWidget {
  @override
  _AnchoredAdaptiveBannerState createState() => _AnchoredAdaptiveBannerState();
}

class _AnchoredAdaptiveBannerState extends State<AnchoredAdaptiveBanner> {
  BannerAd _anchoredAdaptiveAd;
  bool _isLoaded = false;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _loadAd();
  }

  Future<void> _loadAd() async {
    // This was originally dynamic with an await, I changed it to static values for a sanity check, again same problem.
    final AnchoredAdaptiveBannerAdSize size = AnchoredAdaptiveBannerAdSize(Orientation.portrait, width: 300, height: 50);

    _anchoredAdaptiveAd = BannerAd(
      adUnitId: AdManager.bannerAdUnitId,
      size: size,
      request: AdRequest(),
      listener: BannerAdListener(
        onAdLoaded: (Ad ad) {
          setState(() {
            _anchoredAdaptiveAd = ad as BannerAd;
            _isLoaded = true;
          });
        },
        onAdFailedToLoad: (Ad ad, LoadAdError error) {
          ad.dispose();
        },
      ),
    );
    return _anchoredAdaptiveAd.load();
  }

  @override
  Widget build(BuildContext context) {
    if (_anchoredAdaptiveAd != null && _isLoaded)
      return Container(
        width: _anchoredAdaptiveAd.size.width.toDouble(),
        height: _anchoredAdaptiveAd.size.height.toDouble(),
        child: AdWidget(ad: _anchoredAdaptiveAd),
      );
    else
      return Container();
  }

  @override
  void dispose() {
    super.dispose();
    _anchoredAdaptiveAd?.dispose();
  }
}

例如,我在我的家庭小部件中的用法:

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: SafeArea(
        child: Scaffold(
          body: Builder(...),
          floatingActionButton: Container(...),
         bottomNavigationBar: AnchoredAdaptiveBanner()
        ),
      ),
    );
  }
}

正如你所看到的,没有什么是最高层在等待的.我目前使用的是Google_MOBILE_ADS 2.0.1版. 你知道这是什么原因吗?如有任何帮助,我们不胜感激!

推荐答案

解决方案:返回SizedBox.shrink()

Why does this work?

在加载广告之前,您将从Build方法返回一个空容器.如果不将高度或宽度传递给容器,它会尽可能地扩展.在这种情况下,bottomNavigationBars可以无限扩展.这会导致其余的小部件被推出屏幕,页面似乎冻结,直到广告加载.使用SizedBox.shrink()将使容器在加载之前为0x0.

Flutter相关问答推荐

Flutter:sqflite DB

有没有一种正确的方法可以通过上下滑动在两个小部件(在我的情况下是应用程序栏)之间切换?

Flutter 应用程序中的Firebase实时数据库中的orderByChild()不适用于我

什么是dart :这只是dart ?

我有相关的下拉菜单Flutter Windows应用程序的问题

如何从flutter中不同类别的列表中获取所有产品

如何在 VS Code 中启用 Flutter 运行/调试工具栏?

如果其他Provider 的帐户已存在,如何阻止用户登录?

创建混合 TextWidget 和 TextFieldWidget

在Flutter中为容器实现线性渐变背景动画

更改下拉按钮的背景 colored颜色 - flutter

如何在android中 Select 任何文件/文件路径 - Flutter

当我将主题更改为深色然后返回浅色模式时,Getx 会Flutter 更改主题,它不会加载我的自定义主题

如何根据字符串值动态构建和显示小部件?

Flutter - 使用 pin 进行身份验证

有什么方法可以将 ChangeNotifier 与 ValueListenableBuilder 一起使用

如何在椭圆形图像周围添加边框?Flutter

Flutter Widget 测试:无法使用 find.byWidget() 找到小部件

使用 mocktail 包进行单元测试时,类型Null不是Future类型的子类型

设计响应式卡片的最佳方法,以避免像素溢出错误或 _AssertionError