fix(player): 路由覆盖时暂停播放

This commit is contained in:
Zhou Weidong committed 2026-10-20 19:24:49 +08:00
1 parent 911f13f464
commit 699fd427b8
5 files changed
+141 -2

No files matched your search

+93 -1
View File
@@ -1,5 +1,7 @@
// Author: fruit.com.cn
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -10,11 +12,14 @@ import 'package:fruitshorts/app.dart';
import 'package:fruitshorts/core/data/models/drama.dart';
import 'package:fruitshorts/core/data/models/interaction.dart';
import 'package:fruitshorts/core/data/models/play_ticket.dart';
import 'package:fruitshorts/core/data/models/player_port.dart';
import 'package:fruitshorts/core/data/repositories/favorite_repository.dart';
import 'package:fruitshorts/core/data/repositories/playback_repository.dart';
import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart';
import 'package:fruitshorts/core/data/services/playback_session.dart';
import 'package:fruitshorts/core/theme/app_colors.dart';
import 'package:fruitshorts/core/widgets/remote_image.dart';
import 'package:fruitshorts/pages/auth/auth_view.dart';
import 'package:fruitshorts/pages/player/widgets/player_center_toggle.dart';
import 'package:fruitshorts/pages/player/widgets/seek_progress_bar.dart';
@@ -61,6 +66,72 @@ void main() {
_expectPlayerNavigationBar(tester);
});
testWidgets('should_pause_and_resume_player_when_page_route_covers_it', (
tester,
) async {
final players = <_RecordingPlayer>[];
await _pumpApp(
tester,
playerFactory: (_) {
final player = _RecordingPlayer();
players.add(player);
return player;
},
);
await _openSeriesPlayer(tester);
final player = players.firstWhere((item) => item.playing);
expect(player.playing, isTrue);
final navigator = tester.state<NavigatorState>(
find.byType(Navigator).first,
);
unawaited(
navigator.push<void>(
MaterialPageRoute(
builder: (_) => const Scaffold(key: Key('test-covering-route')),
),
),
);
await tester.pumpAndSettle();
expect(find.byKey(const Key('test-covering-route')), findsOneWidget);
expect(player.playing, isFalse);
navigator.pop();
await tester.pumpAndSettle();
expect(player.playing, isTrue);
});
testWidgets('should_pause_feed_when_auth_page_is_pushed_and_resume_on_pop', (
tester,
) async {
final players = <_RecordingPlayer>[];
await _pumpApp(
tester,
playerFactory: (_) {
final player = _RecordingPlayer();
players.add(player);
return player;
},
);
final player = players.firstWhere((item) => item.playing);
expect(player.playing, isTrue);
await tester.tap(find.byKey(const Key('rail-save')));
await tester.pumpAndSettle();
await tester.tap(find.text('Sign In'));
await tester.pumpAndSettle();
expect(find.byType(AuthPage), findsOneWidget);
expect(player.playing, isFalse);
await tester.pageBack();
await tester.pumpAndSettle();
expect(player.playing, isTrue);
});
testWidgets('should_fall_back_to_black_when_poster_is_empty', (tester) async {
await _pumpApp(
tester,
@@ -1071,6 +1142,7 @@ Future<void> _pumpApp(
FakeCatalogRepository? catalog,
FakePlaybackRepository? playback,
FakeInteractionRepository? interactions,
PlayerFactory? playerFactory,
}) async {
tester.view.physicalSize = size;
tester.view.devicePixelRatio = 1;
@@ -1079,7 +1151,7 @@ Future<void> _pumpApp(
final repository = catalog ?? FakeCatalogRepository();
await tester.pumpWidget(
LumaDramaApp(
playerFactory: createWidgetPlayer,
playerFactory: playerFactory ?? createWidgetPlayer,
catalogRepository: repository,
categoryRepository: FakeCategoryRepository(catalog: repository),
watchHistoryRepository: InMemoryWatchHistoryRepository(),
@@ -1094,6 +1166,26 @@ Future<void> _pumpApp(
await tester.pumpAndSettle();
}
class _RecordingPlayer implements PlayerPort {
bool playing = false;
@override
Future<void> initialize() async {}
@override
Future<void> play() async {
playing = true;
}
@override
Future<void> pause() async {
playing = false;
}
@override
Future<void> dispose() async {}
}
const _lockedDrama = Drama(
id: 'locked-demo',
title: 'Locked Demo',