更新
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user