fix(flutter): 修复 iOS 视频首帧闪屏

This commit is contained in:
Zhou Weidong committed 2026-10-20 18:29:10 +08:00
1 parent ca6776580f
commit 6b397015b1
3 files changed
+345 -54

No files matched your search

+9 -54
View File
@@ -5,7 +5,6 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:video_player/video_player.dart';
import '../../core/data/models/drama.dart';
import '../../core/data/services/favorite_controller.dart';
@@ -20,7 +19,6 @@ import '../../core/theme/app_colors.dart';
import '../../core/theme/app_theme.dart';
import '../../core/widgets/auth_gate.dart';
import '../../core/widgets/download_action.dart';
import '../../core/widgets/remote_image.dart';
import '../../l10n/app_localizations.dart';
import 'comments_auth.dart';
import 'player_binding.dart';
@@ -34,6 +32,7 @@ import 'widgets/player_overlay.dart';
import 'widgets/player_overlay_models.dart';
import 'widgets/player_speed_sheet.dart';
import 'widgets/player_unlock_sheet.dart';
import 'widgets/player_video_surface.dart';
import '../../core/data/repositories/watch_history_repository.dart';
import '../../core/data/repositories/playback_repository.dart';
@@ -278,24 +277,6 @@ class _PlayerPageState extends State<PlayerPage> with WidgetsBindingObserver {
final videoPort = port is VideoPlayerPort ? port : null;
final ready = videoPort?.controller.value.isInitialized ?? false;
final theater = logic.pip || logic.pipPreparing;
Widget? video;
if (ready) {
video = GestureDetector(
onTap: () =>
logic.session.setUserWantsPlay(!logic.session.userWantsPlay),
child: FittedBox(
fit: theater ? BoxFit.contain : BoxFit.cover,
child: SizedBox(
width: videoPort!.controller.value.size.width,
height: videoPort.controller.value.size.height,
child: VideoPlayer(
videoPort.controller,
key: ValueKey(videoPort.controller),
),
),
),
);
}
return Stack(
fit: StackFit.expand,
@@ -305,8 +286,14 @@ class _PlayerPageState extends State<PlayerPage> with WidgetsBindingObserver {
key: Key('home-feed-black-background'),
color: Colors.black,
),
if (!ready) _PlayerFallbackBackground(posterUrl: drama.posterUrl),
?video,
PlayerVideoSurface(
controller: videoPort?.controller,
posterUrl: drama.posterUrl,
videoUrl: videoPort?.controller.dataSource ?? episode.videoUrl,
theater: theater,
onTap: () =>
logic.session.setUserWantsPlay(!logic.session.userWantsPlay),
),
if (widget.homeMode && _chromeVisible && !logic.chromeHidden)
Positioned.fill(
child: GestureDetector(
@@ -563,35 +550,3 @@ class _PlayerPageState extends State<PlayerPage> with WidgetsBindingObserver {
);
}
}
class _PlayerFallbackBackground extends StatelessWidget {
const _PlayerFallbackBackground({required this.posterUrl});
final String posterUrl;
@override
Widget build(BuildContext context) {
if (posterUrl.trim().isEmpty) {
return const ColoredBox(
key: Key('player-fallback-background'),
color: Colors.black,
);
}
return Stack(
key: const Key('player-fallback-background'),
fit: StackFit.expand,
children: [
RemoteImage(
posterUrl,
key: const Key('player-fallback-cover'),
fit: BoxFit.cover,
fallbackColor: Colors.black,
),
const ColoredBox(
key: Key('player-fallback-scrim'),
color: Color(0x4D000000),
),
],
);
}
}