feat: 更新 H5ShellPage 以支持顶部安全区域并优化布局
This commit is contained in:
106
lib/main.dart
106
lib/main.dart
@@ -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),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user