首页 > 解决方案 > 如何防止广告在 Flutter_native_admob 中的 ListView/GridView 上重新加载?

问题描述

我正在使用 flutter_native_admob 在我的颤振应用中显示广告,链接

很明显,为了防止广告在列表视图中一次又一次地加载,只需保存控制器并在显示广告时使用它,这将防止广告在列表视图中重新加载。

我正在这样做,但它无助于解决问题。

    class ActivityPage extends StatefulWidget {
  static const routeName = "/activityPage";

  @override
  _ActivityPageState createState() => _ActivityPageState();
}

class _ActivityPageState extends State<ActivityPage> {
  final GlobalKey<SummaryState> _summaryKey = GlobalKey<SummaryState>();

  final controller = NativeAdmobController();
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    PaymentProvider paymentProvider = Provider.of<PaymentProvider>(context);
    return ChangeNotifierProvider(
      create: (context) => MonthDayDataprovider(
        calendarIndex: (DateTime.now().year * 12 + DateTime.now().month),
        day: DateTime.now().day,
      ),
      child: Scaffold(
        appBar: AppBar(
          brightness: Brightness.light,
          backgroundColor: Color(0xFFFAFAFA),
          title: Text(
            "Activity",
            style: Theme.of(context).textTheme.headline6.copyWith(
                  color: Color(0xFFCE2234),
                ),
          ),
        ),
        backgroundColor: Color(0xFFFAFAFA),
        body: ListView(
          children: <Widget>[
            CalorieStatsCard(),
            BMICard(),
            (paymentProvider.subscription == true ||
                    paymentProvider.removeAds == true)
                ? null
                : NativeBannerAds(
                    controller: this.controller,
                  ),
            Calender(),
            Summary(
              key: this._summaryKey,
            ),
            (paymentProvider.subscription == true ||
                    paymentProvider.removeAds == true)
                ? null
                : NativeFullAds(
                    controller: this.controller,
                  )
          ].where((Object o) => o != null).toList(),
        ),
      ),
    );
  }
}

class NativeBannerAds extends StatefulWidget {
  final NativeAdmobController controller;

  const NativeBannerAds({
    Key key,
    @required this.controller,
  }) : super(key: key);

  @override
  _NativeBannerAdsState createState() => _NativeBannerAdsState();
}

class _NativeBannerAdsState extends State<NativeBannerAds> {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      height: 85,
      padding: EdgeInsets.all(12),
      child: NativeAdmob(
        // Your ad unit id
        adUnitID: 'ca-app-pub-xxxxxxxxxxxx/xxxxxxxxxxxxx',
        controller: this.widget.controller,
        error: Center(child: Text("Failed to load the ad")),
        type: NativeAdmobType.banner,
        options: NativeAdmobOptions(
          showMediaContent: true,
          headlineTextStyle: NativeTextStyle(
            backgroundColor: Colors.red,
            color: Colors.blue,
          ),
        ),
      ),
    );
  }
}

class NativeFullAds extends StatefulWidget {
  final NativeAdmobController controller;

  const NativeFullAds({
    Key key,
    @required this.controller,
  }) : super(key: key);
  @override
  _NativeFullAdsState createState() => _NativeFullAdsState();
}

class _NativeFullAdsState extends State<NativeFullAds> {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      height: 375,
      padding: EdgeInsets.all(8),
      child: NativeAdmob(
        // Your ad unit id
        adUnitID: 'ca-app-pub-xxxxxxxxxxxxx/xxxxxxxxxxxx',
        controller: this.widget.controller,
        error: Material(
          child: Center(
            child: Text("Failed to load the ad"),
          ),
        ),
        type: NativeAdmobType.full,
        options: NativeAdmobOptions(
          showMediaContent: true,
          headlineTextStyle: NativeTextStyle(
            backgroundColor: Colors.red,
            color: Colors.blue,
          ),
        ),
      ),
    );
  }
}

在这里,我将控制器保存到父小部件并将其传递给子小部件,但这并没有解决问题,滚动时广告仍会继续加载。

如何解决这个问题呢?

在此处输入图像描述

标签: flutteradmobadsreloading

解决方案


推荐阅读