feat: 添加启动屏幕图像和主题样式;优化 H5 壳的封面隐藏逻辑
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user