feat: 添加启动屏幕图像和主题样式;优化 H5 壳的封面隐藏逻辑

This commit is contained in:
Booker
2026-05-26 22:48:47 +07:00
parent bd3ccf7f2d
commit bb720b227e
12 changed files with 93 additions and 4 deletions

View File

@@ -99,6 +99,7 @@ class _H5ShellPageState extends State<H5ShellPage> {
String? _loadError;
bool _showShellCover = true;
bool _shellBrandingLoaded = false;
Timer? _shellCoverFallbackTimer;
late ShellBranding _shellBranding;
@override
@@ -112,6 +113,10 @@ class _H5ShellPageState extends State<H5ShellPage> {
WebViewController _buildController() {
return WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..addJavaScriptChannel(
'OpenIMShell',
onMessageReceived: _handleShellMessage,
)
..setBackgroundColor(_shellBackground)
..setNavigationDelegate(
NavigationDelegate(
@@ -121,6 +126,7 @@ class _H5ShellPageState extends State<H5ShellPage> {
}
},
onPageStarted: (_) {
_shellCoverFallbackTimer?.cancel();
if (mounted) {
setState(() {
_loadError = null;
@@ -134,6 +140,7 @@ class _H5ShellPageState extends State<H5ShellPage> {
},
onWebResourceError: (error) {
if (error.isForMainFrame ?? true) {
_shellCoverFallbackTimer?.cancel();
if (mounted) {
setState(() {
_loadError = error.description;
@@ -147,6 +154,12 @@ class _H5ShellPageState extends State<H5ShellPage> {
);
}
@override
void dispose() {
_shellCoverFallbackTimer?.cancel();
super.dispose();
}
Future<void> _runJavaScriptSafely(String source) async {
try {
await _controller.runJavaScript(source);
@@ -165,9 +178,42 @@ class _H5ShellPageState extends State<H5ShellPage> {
if (mounted) {
setState(() {
_progress = 100;
_showShellCover = false;
});
}
_scheduleShellCoverFallback();
}
void _handleShellMessage(JavaScriptMessage message) {
try {
final decoded = jsonDecode(message.message);
if (decoded is Map && decoded['type'] == 'first-screen-ready') {
_hideShellCover();
}
} catch (_) {
if (message.message == 'first-screen-ready') {
_hideShellCover();
}
}
}
void _scheduleShellCoverFallback() {
_shellCoverFallbackTimer?.cancel();
_shellCoverFallbackTimer = Timer(
const Duration(seconds: 4),
_hideShellCover,
);
}
void _hideShellCover() {
_shellCoverFallbackTimer?.cancel();
if (!mounted || !_showShellCover) {
return;
}
setState(() {
_progress = 100;
_showShellCover = false;
});
}
Future<void> _loadShellBrandingIfNeeded() async {
@@ -212,6 +258,7 @@ class _H5ShellPageState extends State<H5ShellPage> {
final targetUrl = AppConfig.canonicalizeMainFrameUrl(url);
if (mounted) {
_shellCoverFallbackTimer?.cancel();
setState(() {
_loadError = null;
_progress = 0;