Flutter鸿蒙跨平台插件:webview_cookie_manager 使用指南
webview_cookie_manager是一个Flutter插件,用于管理WebView的cookies,支持鸿蒙平台。该插件通过iOS的httpCookieStore和Android的CookieManager实现cookie存储与检索,适用于登录状态保持等场景。安装时需在pubspec.yaml中添加git依赖,并执行flutter pub get。
插件介绍
webview_cookie_manager 是一个用于管理 WebView cookies 的 Flutter 插件,支持在鸿蒙平台上使用。该插件使用 iOS 的 httpCookieStore 和 Android 的 CookieManager 来存储和检索 cookies。
该插件适用于需要管理 WebView cookies 的应用场景,如登录状态保持、用户偏好设置等。
安装与使用
安装方式
在引用的项目中,pubspec.yaml 中 dependencies 新增配置:
dependencies:
webview_cookie_manager:
git:
url: "https://atomgit.com/openharmony-sig/fluttertpc_webview_cookie_manager.git"
path: "."
执行命令安装依赖:
flutter pub get
基本使用示例
以下是一个简单的使用示例,展示如何在鸿蒙平台上使用 webview_cookie_manager 插件管理 WebView cookies:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:webview_cookie_manager/webview_cookie_manager.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(primarySwatch: Colors.blue),
home: const WebViewPage(),
);
}
}
class WebViewPage extends StatefulWidget {
const WebViewPage({Key? key}) : super(key: key);
_WebViewPageState createState() => _WebViewPageState();
}
class _WebViewPageState extends State<WebViewPage> {
final cookieManager = WebviewCookieManager();
WebViewController controller = WebViewController();
final String _url = 'https://www.nvidia.cn';
final String cookieValue = 'some-cookie-value';
final String domain = 'm.youtube.com';
final String cookieName = 'some_cookie_name';
void initState() {
super.initState();
cookieManager.clearCookies();
controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(const Color(0x00000000))
..loadRequest(Uri.parse(_url))
..setNavigationDelegate(NavigationDelegate(
onPageFinished: (_) async {
final gotCookies = await cookieManager.getCookies(_url);
for (var item in gotCookies) {
print(item);
}
},
));
cookieManager.setCookies([
Cookie(cookieName, cookieValue)
..domain = domain
..expires = DateTime.now().add(Duration(days: 10))
..httpOnly = false
]);
}
void setCookiesFunc() {
Cookie cookie = Cookie(cookieName, cookieValue)
..domain = 'www.nvidia.cn'
..expires = DateTime.now().add(Duration(days: 10))
..secure = false
..httpOnly = false;
cookieManager.setCookies([cookie], origin: 'https://www.nvidia.cn');
}
void clearCookies() {
cookieManager.clearCookies();
// 出现弹窗提示 清理cookies成功
_showInfoDialog('提示', "Cookies清理成功");
}
void hasCookie() async {
bool cookiesExist = await cookieManager.hasCookies();
String content = cookiesExist ? '存在cookie' : '不存在cookie';
_showInfoDialog('提示', content);
}
// 弹窗提示
void _showInfoDialog(String title, String content) {
showDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text(title),
content: Text(content),
actions: [
TextButton(
child: const Text('确定'),
onPressed: () => Navigator.of(context).pop(context),
)
],
),
);
}
void removeCookie() {
cookieManager.removeCookie(_url);
}
void showCookieListDialog(BuildContext context, List<Cookie> cookies) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Cookies'),
content: SizedBox(
width: double.maxFinite,
height: 400,
child: ListView.builder(
itemCount: cookies.length,
itemBuilder: (context, index) {
final cookie = cookies[index];
return ListTile(
leading: const Icon(Icons.cookie),
title: Text(cookie.name),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("值: ${cookie.value}"),
Text("域: ${cookie.domain ?? '无'}"),
Text(
"过期: ${cookie.expires?.toLocal().toString() ?? 'Session'}"),
Text(
"HttpOnly: ${cookie.httpOnly}, Secure: ${cookie.secure}"),
],
),
isThreeLine: true,
);
},
),
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text("关闭"),
),
],
);
},
);
}
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
actions: [
IconButton(
icon: Icon(Icons.ac_unit),
onPressed: () async {
final cookieList = await cookieManager.getCookies(_url);
showCookieListDialog(context, cookieList);
},
),
IconButton(icon: Icon(Icons.add), onPressed: setCookiesFunc),
IconButton(icon: Icon(Icons.delete), onPressed: clearCookies),
IconButton(icon: Icon(Icons.device_unknown), onPressed: hasCookie),
IconButton(icon: Icon(Icons.beach_access), onPressed: removeCookie)
],
),
body: WebViewWidget(controller: controller),
),
);
}
}
核心 API 说明
| API 名称 | 描述 | 返回值 |
|---|---|---|
getCookies |
获取指定 URL 的 cookies | Future<List<Cookie>> |
setCookies |
设置 cookies | Future<void> |
hasCookies |
检查是否有任何 cookies | Future<bool> |
removeCookie |
删除指定 URL 的 cookies | Future<void> |
clearCookies |
清除所有 cookies | Future<void> |
约束与限制
兼容性
该插件支持以下平台:
- Android (API level 9+)
- iOS (11+)
- 鸿蒙平台
注意事项
-
Domain 属性:根据 RFC,Domain 属性不是必需的,但空域会导致未定义的行为。因此,强烈建议指定 Domain 属性。
-
Secure 属性:如果看到错误
Strict Secure Cookie policy does not allow setting a secure cookie for http://your-domain.net/ for apps targeting >= R.,则需要在设置 cookie 时指定 origin,此时不需要设置 domain。
总结
webview_cookie_manager 插件提供了一种简单高效的方式来管理 WebView cookies,适用于各种需要管理 cookies 的应用场景。该插件具有以下优点:
- 简单易用:提供了简洁的 API,只需调用相应的方法即可管理 cookies。
- 跨平台支持:支持在 Android、iOS 和鸿蒙平台上使用。
- 功能丰富:支持获取、设置、删除和清除 cookies 等操作。
- 性能优异:直接调用系统底层 API,管理 cookies 的效率高。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐


所有评论(0)