feat: 更新 H5ShellPage 以支持顶部安全区域并优化布局

This commit is contained in:
Booker
2026-05-27 14:33:26 +07:00
parent 550b12a812
commit 3f71ba0e23

View File

@@ -549,6 +549,7 @@ class _H5ShellPageState extends State<H5ShellPage> {
@override
Widget build(BuildContext context) {
final currentSlot = _currentSlot;
final topInset = MediaQuery.paddingOf(context).top;
final bottomInset = MediaQuery.viewInsetsOf(context).bottom;
final showLineSwitch = !currentSlot.showShellCover &&
currentSlot.loadError == null &&
@@ -564,55 +565,68 @@ class _H5ShellPageState extends State<H5ShellPage> {
},
child: Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
bottom: false,
child: Stack(
children: [
Positioned.fill(
child: _ShellFallback(progress: currentSlot.progress),
),
Positioned.fill(
child: IndexedStack(
index: _currentLineIndex,
children: [
for (var index = 0; index < _lineSlots.length; index += 1)
WebViewWidget(
key: ValueKey<int>(index),
controller: _lineSlots[index].controller,
),
],
),
),
if (currentSlot.showShellCover)
Positioned.fill(
child: IgnorePointer(
body: Stack(
children: [
SafeArea(
bottom: false,
child: Stack(
children: [
Positioned.fill(
child: _ShellFallback(progress: currentSlot.progress),
),
),
if (!currentSlot.showShellCover && currentSlot.progress < 100)
LinearProgressIndicator(
value: currentSlot.progress == 0
? null
: currentSlot.progress / 100,
minHeight: 2,
),
if (currentSlot.loadError != null)
_ErrorPanel(
message: currentSlot.loadError!,
onRetry: () => unawaited(_reloadCurrentLine()),
),
if (showLineSwitch)
Positioned(
left: 20,
right: 20,
bottom: MediaQuery.paddingOf(context).bottom + 14,
child: _LineSwitchBar(
currentLine: _currentLine,
onSwitch: _showLineSwitcher,
Positioned.fill(
child: IndexedStack(
index: _currentLineIndex,
children: [
for (var index = 0;
index < _lineSlots.length;
index += 1)
WebViewWidget(
key: ValueKey<int>(index),
controller: _lineSlots[index].controller,
),
],
),
),
),
],
),
if (currentSlot.showShellCover)
Positioned.fill(
child: IgnorePointer(
child: _ShellFallback(progress: currentSlot.progress),
),
),
if (!currentSlot.showShellCover && currentSlot.progress < 100)
LinearProgressIndicator(
value: currentSlot.progress == 0
? null
: currentSlot.progress / 100,
minHeight: 2,
),
if (currentSlot.loadError != null)
_ErrorPanel(
message: currentSlot.loadError!,
onRetry: () => unawaited(_reloadCurrentLine()),
),
if (showLineSwitch)
Positioned(
left: 20,
right: 20,
bottom: MediaQuery.paddingOf(context).bottom + 14,
child: _LineSwitchBar(
currentLine: _currentLine,
onSwitch: _showLineSwitcher,
),
),
],
),
),
Positioned(
top: 0,
left: 0,
right: 0,
height: topInset,
child: const ColoredBox(color: Colors.white),
),
],
),
),
);