You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

81 lines
1.8 KiB

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<OpenWebView> createState() => _OpenWebViewState();
}
class _OpenWebViewState extends State<OpenWebView> {
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),
);
}
}