修复处理内容包括公告 WebView、文件预览页、分享页兜底获取下载链接的隐藏 WebView。

This commit is contained in:
2026-05-27 23:47:10 +08:00
parent 12f2c2660e
commit 24d20cbfcb
4 changed files with 545 additions and 242 deletions
@@ -1,7 +1,13 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as desktop;
import 'package:webview_flutter/webview_flutter.dart' as mobile;
bool get _useDesktopWebView =>
!kIsWeb && (Platform.isWindows || Platform.isLinux);
class AnnouncementDialog extends StatefulWidget {
final String title;
@@ -26,11 +32,8 @@ class AnnouncementDialog extends StatefulWidget {
await showDialog<void>(
context: context,
barrierDismissible: true,
builder: (_) => AnnouncementDialog(
title: title,
html: html,
baseUrl: baseUrl,
),
builder: (_) =>
AnnouncementDialog(title: title, html: html, baseUrl: baseUrl),
);
}
@@ -39,35 +42,39 @@ class AnnouncementDialog extends StatefulWidget {
}
class _AnnouncementDialogState extends State<AnnouncementDialog> {
late final WebViewController _controller;
mobile.WebViewController? _mobileController;
desktop.InAppWebViewController? _desktopController;
late final String _html;
late final String _baseUrl;
bool _loading = true;
@override
void initState() {
super.initState();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(Colors.transparent)
..setNavigationDelegate(
NavigationDelegate(
onPageFinished: (_) {
if (mounted) setState(() => _loading = false);
},
),
);
final origin = Uri.parse(widget.baseUrl).origin;
_html = _wrapHtml(widget.html);
_baseUrl = '$origin/';
_load();
if (!_useDesktopWebView) {
_mobileController = mobile.WebViewController()
..setJavaScriptMode(mobile.JavaScriptMode.unrestricted)
..setBackgroundColor(Colors.transparent)
..setNavigationDelegate(
mobile.NavigationDelegate(
onPageFinished: (_) {
if (mounted) setState(() => _loading = false);
},
),
)
..loadHtmlString(_html, baseUrl: _baseUrl);
}
}
Future<void> _load() async {
final origin = Uri.parse(widget.baseUrl).origin;
final html = _wrapHtml(widget.html);
await _controller.loadHtmlString(
html,
baseUrl: '$origin/',
);
@override
void dispose() {
_desktopController?.dispose();
super.dispose();
}
String _wrapHtml(String body) {
@@ -162,7 +169,7 @@ $body
Expanded(
child: Stack(
children: [
WebViewWidget(controller: _controller),
_buildWebView(),
if (_loading)
const Center(child: CircularProgressIndicator()),
],
@@ -174,4 +181,29 @@ $body
),
);
}
Widget _buildWebView() {
if (_useDesktopWebView) {
return desktop.InAppWebView(
initialData: desktop.InAppWebViewInitialData(
data: _html,
baseUrl: desktop.WebUri(_baseUrl),
),
initialSettings: desktop.InAppWebViewSettings(
javaScriptEnabled: true,
domStorageEnabled: true,
transparentBackground: true,
supportZoom: false,
),
onWebViewCreated: (controller) {
_desktopController = controller;
},
onLoadStop: (_, url) {
if (mounted) setState(() => _loading = false);
},
);
}
return mobile.WebViewWidget(controller: _mobileController!);
}
}