import 'package:dating_touchme_app/components/page_appbar.dart'; import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; class OpenWebView extends StatefulWidget { final String url; final String? title; const OpenWebView({super.key, required this.url, this.title}); @override State createState() => _OpenWebViewState(); } class _OpenWebViewState extends State { late final WebViewController controller; @override void initState() { controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setBackgroundColor(const Color(0x00000000)) ..setNavigationDelegate( NavigationDelegate( onPageFinished: (url) async { await controller.runJavaScript(_replaceTextJs()); }, ), ) ..loadRequest(Uri.parse(Uri.decodeComponent(widget.url))); super.initState(); } String _replaceTextJs() { return r""" (function() { const replaceMap = { '趣恋恋': '星球奇遇记', }; function walk(node) { if (node.nodeType === Node.TEXT_NODE) { let text = node.nodeValue; if (!text) return; Object.keys(replaceMap).forEach(key => { text = text.split(key).join(replaceMap[key]); }); node.nodeValue = text; return; } if ( node.nodeType === Node.ELEMENT_NODE && !['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA'].includes(node.tagName) ) { for (let i = 0; i < node.childNodes.length; i++) { walk(node.childNodes[i]); } } } walk(document.body); })(); """; } @override Widget build(BuildContext context) { return Scaffold( appBar: PageAppbar(title: widget.title ?? "",), body: WebViewWidget(controller: controller), ); } }