Flutter广告拦截插件adblocker_webview的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter广告拦截插件adblocker_webview的使用

简介

adblocker_webview 是一个在 Flutter 中实现的 WebView 插件,可以阻止网页中出现的大部分广告。当前实现基于官方的 flutter_inappwebview 包,因此该包的功能和限制也包含在内。

平台支持

平台 Android iOS
支持 SDK 19+ 或 20+ 11.0+

WebView 实现

入门

添加依赖

pubspec.yaml 文件中添加 adblocker_webview 作为依赖:

dependencies:
  adblocker_webview: ^x.x.x  # 请替换为最新版本号

使用

1. 获取 AdBlockerWebviewController 实例

final _adBlockerWebviewController = AdBlockerWebviewController.instance;

最好在显示 WebView 之前初始化控制器:

@override
void initState() {
  super.initState();
  _adBlockerWebviewController.initialize();
  // ... 其他代码
}

2. 在 widget 树中添加 AdBlockerWebview

AdBlockerWebview(
  url: "Valid url Here",
  adBlockerWebviewController: _adBlockerWebviewController,
  onProgress: (progress) {
    setState(() {
      _progress = progress;
    });
  },
  shouldBlockAds: true,
  // 其他参数
);

支持的参数

const AdBlockerWebview({
  required this.adBlockerWebviewController,
  required this.shouldBlockAds,
  this.url,
  this.initialHtmlData,
  this.onLoadStart,
  this.onLoadFinished,
  this.onProgress,
  this.onLoadError,
  this.onTitleChanged,
  this.options,
  this.additionalHostsToBlock = const [],
  super.key,
}) : assert(
    (url == null && initialHtmlData != null) ||
    (url != null && initialHtmlData == null),
    'Both url and initialHtmlData can not be non null');

缓存

  • API 响应的广告主机列表会自动缓存,无需额外配置!

贡献

欢迎贡献 😄。如果您想添加新功能或发现错误,请在此 GitHub 仓库 提交问题。

贡献指南

  1. 首先创建一个 issue,确保您的请求不是重复的。
  2. 创建仓库的 fork(如果是第一次贡献)。
  3. develop 分支创建一个新的分支。
  4. 分支名称应指示贡献类型:
    • feature/** 用于新功能
    • bugfix/** 用于修复错误
  5. develop 分支提交 PR。

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 adblocker_webview 插件:

import 'package:adblocker_webview/adblocker_webview.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _adBlockerWebviewController = AdBlockerWebviewController.instance;
  bool _showBrowser = false;
  bool _shouldBlockAds = true;
  String _url = "";

  @override
  void initState() {
    super.initState();
    _adBlockerWebviewController.initialize();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      floatingActionButton: _showBrowser
          ? FloatingActionButton(
              child: const Icon(Icons.edit),
              onPressed: () {
                setState(() {
                  _showBrowser = false;
                });
              },
            )
          : null,
      body: _showBrowser
          ? Browser(
              url: _url,
              controller: _adBlockerWebviewController,
              shouldBlockAds: _shouldBlockAds,
            )
          : UrlInput(
              onSubmit: (url) {
                setState(() {
                  _url = url;
                  _showBrowser = true;
                });
              },
              onBlockAdsStatusChange: (shouldBlockAds) {
                setState(() {
                  _shouldBlockAds = shouldBlockAds;
                });
              },
              shouldBlockAds: _shouldBlockAds,
            ),
    );
  }
}

class Browser extends StatelessWidget {
  final String url;
  final AdBlockerWebviewController controller;
  final bool shouldBlockAds;

  const Browser({
    Key? key,
    required this.url,
    required this.controller,
    required this.shouldBlockAds,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return AdBlockerWebview(
      url: url,
      adBlockerWebviewController: controller,
      onProgress: (progress) {
        // 处理进度变化
      },
      shouldBlockAds: shouldBlockAds,
    );
  }
}

class UrlInput extends StatelessWidget {
  final Function(String) onSubmit;
  final Function(bool) onBlockAdsStatusChange;
  final bool shouldBlockAds;

  const UrlInput({
    Key? key,
    required this.onSubmit,
    required this.onBlockAdsStatusChange,
    required this.shouldBlockAds,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(
          onSubmitted: (value) {
            onSubmit(value);
          },
          decoration: const InputDecoration(
            labelText: 'Enter URL',
          ),
        ),
        SwitchListTile(
          title: const Text('Block Ads'),
          value: shouldBlockAds,
          onChanged: (value) {
            onBlockAdsStatusChange(value);
          },
        ),
      ],
    );
  }
}

希望这个示例能帮助你更好地理解和使用 adblocker_webview 插件!如果有任何问题或建议,请随时提出来。


更多关于Flutter广告拦截插件adblocker_webview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter广告拦截插件adblocker_webview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 adblocker_webview 插件在 Flutter 中实现广告拦截的示例代码。这个插件允许你在 WebView 中加载网页并自动拦截广告。

首先,确保你已经在 pubspec.yaml 文件中添加了 adblocker_webview 依赖:

dependencies:
  flutter:
    sdk: flutter
  adblocker_webview: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 项目中创建一个新的 Dart 文件,例如 main.dart,并在其中编写以下代码:

import 'package:flutter/material.dart';
import 'package:adblocker_webview/adblocker_webview.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AdBlockWebViewExample(),
    );
  }
}

class AdBlockWebViewExample extends StatefulWidget {
  @override
  _AdBlockWebViewExampleState createState() => _AdBlockWebViewExampleState();
}

class _AdBlockWebViewExampleState extends State<AdBlockWebViewExample> {
  final AdBlockWebViewController _controller = AdBlockWebViewController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AdBlocker WebView Example'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: AdBlockWebView(
              initialUrl: 'https://example.com', // 替换为你想要加载的URL
              javascriptMode: JavascriptMode.unrestricted,
              adblockEnabled: true,
              adblockRules: [
                // 在这里添加你的广告拦截规则
                '||example-ad-network.com^$important,third-party',
                '||another-ad-network.com^$important,third-party',
              ],
              onWebViewCreated: (controller) {
                _controller.complete(controller);
              },
              onPageFinished: (url) {
                print('Page finished loading: $url');
              },
              navigationDelegate: (request) {
                if (request.url.startsWith("https://example-ad-network.com")) {
                  return NavigationDecision.prevent;
                }
                return NavigationDecision.navigate;
              },
            ),
          ),
          ElevatedButton(
            onPressed: () async {
              // 示例:通过控制器加载新的URL
              await _controller.futureValue.loadUrl('https://another-example.com');
            },
            child: Text('Load Another URL'),
          ),
        ],
      ),
    );
  }
}

解释

  1. 依赖导入:首先导入 flutteradblocker_webview 包。
  2. 主应用:创建一个 MyApp 类作为应用的入口,它包含一个 AdBlockWebViewExample 小部件。
  3. 广告拦截 WebView
    • AdBlockWebView 小部件用于加载网页并拦截广告。
    • initialUrl:设置初始加载的 URL。
    • javascriptMode:启用 JavaScript。
    • adblockEnabled:启用广告拦截。
    • adblockRules:添加广告拦截规则,这些规则使用 Adblock Plus 的语法。
    • onWebViewCreated:当 WebView 创建完成时,获取控制器以便后续操作。
    • onPageFinished:当页面加载完成时触发。
    • navigationDelegate:可以拦截并处理导航请求,例如阻止加载广告 URL。
  4. 按钮操作:通过一个按钮示例展示如何使用控制器加载新的 URL。

这样,你就可以在 Flutter 应用中使用 adblocker_webview 插件来加载网页并拦截广告了。根据实际需要,你可以调整广告拦截规则和处理逻辑。

回到顶部