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
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),
|
|
);
|
|
}
|
|
}
|