This commit is contained in:
wyf
2025-05-13 11:59:04 +08:00
parent eae7a2284d
commit fb5c3864a3
101 changed files with 8427 additions and 1953 deletions

View File

@@ -1,51 +1,79 @@
// import 'package:flutter/material.dart';
// import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:url_launcher/url_launcher.dart';
// class WebViewWidget extends StatefulWidget {
// final String url;
// const WebViewWidget({Key? key, required this.url}) : super(key: key);
class MyWebView extends StatefulWidget {
final String url;
final Function()? onLoad;
final Function(MyWebView view, String msg)? onMessage;
// @override
// _WebViewWidgetState createState() => _WebViewWidgetState();
// }
const MyWebView({
Key? key,
required this.url,
this.onLoad,
this.onMessage,
}) : super(key: key);
// class _WebViewWidgetState extends State<WebViewWidget> {
// late WebViewController _webViewController;
@override
State<MyWebView> createState() => _MyWebViewState();
}
// @override
// void initState() {
// super.initState();
// // 初始化 WebView 控件
// WebView.platform = SurfaceAndroidWebView();
// }
class _MyWebViewState extends State<MyWebView> {
late final WebViewController _controller;
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// appBar: AppBar(
// title: Text('WebView'),
// ),
// body: WebView(
// initialUrl: widget.url, // 设置要打开的网页地址
// javascriptMode: JavascriptMode.unrestricted, // 启用 JavaScript
// onWebViewCreated: (WebViewController webViewController) {
// _webViewController = webViewController;
// },
// onPageStarted: (String url) {
// print("页面开始加载:$url");
// },
// onPageFinished: (String url) {
// print("页面加载完成:$url");
// },
// navigationDelegate: (NavigationRequest request) {
// if (request.url.startsWith('https://www.google.com/')) {
// print('拦截了URL请求: ${request.url}');
// return NavigationDecision.prevent; // 拦截特定的请求
// }
// return NavigationDecision.navigate;
// },
// gestureNavigationEnabled: true, // 启用手势返回
// ),
// );
// }
// }
@override
void initState() {
super.initState();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate(
NavigationDelegate(
onPageFinished: (url) {
widget.onLoad?.call();
},
onWebResourceError: (error) {
print("WebView 加载错误: ${error.description}");
},
onNavigationRequest: (NavigationRequest request) {
final url = request.url;
if (url.startsWith('http') || url.startsWith('https')) {
return NavigationDecision.navigate;
}
if (url.startsWith('weixin://')) {
_launchWeChatUrl(url);
return NavigationDecision.prevent;
}
print('拦截未知协议: $url');
return NavigationDecision.prevent;
},
),
)
..addJavaScriptChannel(
'FlutterChannel',
onMessageReceived: (msg) {
widget.onMessage?.call(widget, msg.message);
},
)
..loadRequest(Uri.parse(widget.url));
}
void _launchWeChatUrl(String url) async {
final uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri);
} else {
print('⚠️ 无法跳转微信: $url');
}
}
// 提供方法给外部调用 JS
void sendData(String data) {
_controller.runJavaScript("window.postMessage('$data')");
}
@override
Widget build(BuildContext context) {
return WebViewWidget(controller: _controller);
}
}