Flutter广告拦截插件adblocker_webview的使用
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 仓库 提交问题。
贡献指南
- 首先创建一个 issue,确保您的请求不是重复的。
- 创建仓库的 fork(如果是第一次贡献)。
- 从
develop
分支创建一个新的分支。 - 分支名称应指示贡献类型:
feature/**
用于新功能bugfix/**
用于修复错误
- 向
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
更多关于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'),
),
],
),
);
}
}
解释
- 依赖导入:首先导入
flutter
和adblocker_webview
包。 - 主应用:创建一个
MyApp
类作为应用的入口,它包含一个AdBlockWebViewExample
小部件。 - 广告拦截 WebView:
AdBlockWebView
小部件用于加载网页并拦截广告。initialUrl
:设置初始加载的 URL。javascriptMode
:启用 JavaScript。adblockEnabled
:启用广告拦截。adblockRules
:添加广告拦截规则,这些规则使用 Adblock Plus 的语法。onWebViewCreated
:当 WebView 创建完成时,获取控制器以便后续操作。onPageFinished
:当页面加载完成时触发。navigationDelegate
:可以拦截并处理导航请求,例如阻止加载广告 URL。
- 按钮操作:通过一个按钮示例展示如何使用控制器加载新的 URL。
这样,你就可以在 Flutter 应用中使用 adblocker_webview
插件来加载网页并拦截广告了。根据实际需要,你可以调整广告拦截规则和处理逻辑。