简体   繁体   English

如何为 flutter web 禁用 admob

[英]How to disable admob for flutter web

i have a flutter app.我有一个 flutter 应用程序。 It's working on web browsers and mobile devices.它适用于 web 浏览器和移动设备。 I have added ad mob for showing banner ads.我添加了用于显示横幅广告的 ad mob。 But i cant run the project because of google_mobile_ads doesn't support web.但我无法运行该项目,因为 google_mobile_ads 不支持 web。 I'm starting google mobile ads if the current platform is a mobile device.如果当前平台是移动设备,我将启动谷歌移动广告。 I have an export.dart like this:我有一个 export.dart 像这样:

export 'ad_mobile.dart' if (dart.library.html) 'ad_web.dart';

ad_mobile.dart: ad_mobile.dart:

import 'package:google_mobile_ads/google_mobile_ads.dart';

Future<dynamic> initAds() async {
  await _initGoogleMobileAds();
 }

Future<InitializationStatus> _initGoogleMobileAds() {
 RequestConfiguration configuration = RequestConfiguration(
 testDeviceIds: <String>[
  testDeviceId,
],);

 MobileAds.instance.updateRequestConfiguration(configuration);
 return MobileAds.instance.initialize();

} }

and ad_web.dart is:和 ad_web.dart 是:

import 'dart:developer';

 Future initAds() async {
 log('ADS DOES\'NT SUPPORTED FOR WEB PLATFORMS');
 }

When i run the app on Chrome, app starts but stuck at white screen.当我在 Chrome 上运行应用程序时,应用程序启动但卡在白屏。 And i get this error on debug console:我在调试控制台上收到此错误:

Error: MissingPluginException(No implementation found for method _init on channel plugins.flutter.io/google_mobile_ads)错误:MissingPluginException(在通道插件上找不到方法 _init 的实现。flutter.io/google_mobile_ads)

There are ways to make it work with less code but if this way it is easier to maintain and extend your code.有一些方法可以使其使用更少的代码,但如果这样,维护和扩展代码会更容易。
You need to change how you import your files based on the platform.您需要根据平台更改导入文件的方式。

First create an abstract class around Admob:首先在Admob周围创建一个抽象的class:

abstract class AdmobWrapper{
  factory AdmobWrapper() => createAdmobWrapper();
  Future<dynamic> init();
}

Second create the platform files:其次创建平台文件:
Generic platform:通用平台:

AdmobWrapper createAdmobWrapper() =>  throw UnimplementedError('createAdmobWrapper()'); 

IO (Mobile) platform: IO(移动)平台:

    AdmobWrapper createAdmobWrapper() => AdmobWrapperIO();
    class AdmobWrapperIO() implements AdmobWrapper(){
        factory AdmobWrapperIO() => _instance;
        AdmobWrapperIO._internal();
        static final AdmobWrapperIO_instance = AdmobWrapperIO._internal();
       
        Future<dynamic> init(){
         .... do init here
         }
    }

Web platform: Web平台:

    AdmobWrapper createAdmobWrapper() => AdmobWrapperWeb();
    class AdmobWrapperWeb implements AdmobWrapper {
        factory AdmobWrapperWeb() => _instance;
        AdmobWrapperWeb._internal();
        static final AdmobWrapperWeb _instance = AdmobWrapperWeb._internal();
       
        Future<dynamic> init(){
         // nothing here
         }
       }

Third add platform imports to your abstract class:第三次将平台导入添加到您的抽象 class:

import 'package:genericPlatform.dart' //   <-- this 2 slash is important
  if(dart.library.io) 'package:yourRealAdmobPackage'
  if(dart.library.html) 'package:yourWebPackage'
 abstract class AdmobWrapper(){ /// rest of the code we made in first step

You can call AdmobWrapper().init() now.您现在可以调用 AdmobWrapper().init()。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM