fix(player): 隔离播放资源所有权并修复黑屏

This commit is contained in:
Zhou Weidong committed 2026-10-26 17:03:19 +08:00
1 parent 54eb5a60a8
commit bb2c729a7e
9 files changed
+223 -25

No files matched your search

+62
View File
@@ -32,6 +32,68 @@ void main() {
await session.close();
});
test('should_not_retire_home_controller_when_player_switches_episodes', () async {
final factory = FakeFactory();
final home = PlaybackSession(
episodes: episodes,
factory: factory.create,
canPlay: (episode) => episode.isFree,
owner: PlaybackSessionOwner.home,
);
await home.select(0, preloadIndex: 1);
await home.preloadSettled;
final homePlayer = home.active;
expect(homePlayer, isNotNull);
final player = PlaybackSession(
episodes: episodes,
factory: factory.create,
canPlay: (episode) => episode.isFree,
owner: PlaybackSessionOwner.player,
);
await player.select(0, preloadIndex: 1);
await player.select(1, previousIndex: 0);
await player.preloadSettled;
expect(home.active, same(homePlayer));
expect(
factory.created
.firstWhere((candidate) => identical(candidate, homePlayer))
.disposed,
isFalse,
);
expect(player.active, isNot(same(homePlayer)));
await player.close();
await home.close();
});
test('should_keep_home_controller_alive_when_player_session_closes', () async {
final factory = FakeFactory();
final home = PlaybackSession(
episodes: episodes,
factory: factory.create,
canPlay: (episode) => episode.isFree,
owner: PlaybackSessionOwner.home,
);
await home.select(0);
final homePlayer = home.active! as FakePlayer;
final player = PlaybackSession(
episodes: episodes,
factory: factory.create,
canPlay: (episode) => episode.isFree,
owner: PlaybackSessionOwner.player,
);
await player.select(0);
await player.select(1);
await player.close();
expect(homePlayer.disposed, isFalse);
expect(home.active, same(homePlayer));
expect(home.currentIndex, 0);
await home.close();
});
test('should_release_previous_player_immediately_when_selecting_locked', () async {
final lockedEpisodes = [
Episode(
+18 -6
View File
@@ -131,7 +131,7 @@ void main() {
await tester.tap(find.byKey(const Key('home-feed-full-series')));
await tester.pumpAndSettle();
final fullPlayer = find.byType(PlayerPage);
final fullPlayer = _fullPlayerFinder();
final fullLogic = _pageLogic(tester, fullPlayer);
expect(fullLogic.session, isNot(same(sourceLogic.session)));
final fullPlayerPort = fullLogic.session.active! as VideoPlayerPort;
@@ -223,11 +223,17 @@ void main() {
await tester.tap(find.byKey(const Key('home-feed-full-series')));
await tester.pumpAndSettle();
expect(find.byType(PlayerPage), findsOneWidget);
expect(_fullPlayerFinder(), findsOneWidget);
expect(find.byKey(const Key('player-play-toggle')), findsOneWidget);
expect(find.byKey(const Key('home-feed-center-play')), findsNothing);
expect(find.byKey(const Key('home-tabs-bar')), findsNothing);
expect(find.byKey(const Key('recommend-top-nav')), findsNothing);
expect(
find.byKey(const Key('home-feed-center-play')).hitTestable(),
findsNothing,
);
expect(find.byKey(const Key('home-tabs-bar')).hitTestable(), findsNothing);
expect(
find.byKey(const Key('recommend-top-nav')).hitTestable(),
findsNothing,
);
await tester.tap(find.byKey(const Key('player-back')));
await tester.pumpAndSettle();
@@ -259,7 +265,7 @@ void main() {
await tester.tap(find.byKey(const Key('home-feed-full-series')));
await tester.pumpAndSettle();
final fullLogic = _pageLogic(tester, find.byType(PlayerPage));
final fullLogic = _pageLogic(tester, _fullPlayerFinder());
await tester.drag(
find.byKey(const Key('player-video-tap')),
const Offset(0, -560),
@@ -1646,6 +1652,12 @@ PlayerLogic _pageLogic(WidgetTester tester, Finder page) {
return state.logic as PlayerLogic;
}
Finder _fullPlayerFinder() {
return find.byWidgetPredicate(
(widget) => widget is PlayerPage && widget.handoff != null,
);
}
class _RouteVideoFactory {
final List<_RouteVideoPlayer> created = [];
final List<Episode> episodes = [];
+6 -6
View File
@@ -471,13 +471,13 @@ void main() {
await tester.tap(find.byKey(const Key('home-feed-series-name')));
await tester.pumpAndSettle();
expect(find.byType(PlayerPage), findsOneWidget);
expect(find.byType(PlayerPage).last, findsOneWidget);
expect(
tester.widget<PlayerPage>(find.byType(PlayerPage)).homeMode,
tester.widget<PlayerPage>(find.byType(PlayerPage).last).homeMode,
isFalse,
);
expect(find.byKey(const Key('player-back')), findsOneWidget);
expect(find.byKey(const Key('home-tabs-bar')), findsNothing);
expect(find.byKey(const Key('home-tabs-bar')).hitTestable(), findsNothing);
await tester.tap(find.byKey(const Key('player-back')));
await tester.pumpAndSettle();
expect(find.byKey(const Key('recommend-page')), findsOneWidget);
@@ -485,13 +485,13 @@ void main() {
await tester.tap(find.byKey(const Key('home-feed-full-series')));
await tester.pumpAndSettle();
expect(find.byType(PlayerPage), findsOneWidget);
expect(find.byType(PlayerPage).last, findsOneWidget);
expect(
tester.widget<PlayerPage>(find.byType(PlayerPage)).homeMode,
tester.widget<PlayerPage>(find.byType(PlayerPage).last).homeMode,
isFalse,
);
expect(find.byKey(const Key('player-back')), findsOneWidget);
expect(find.byKey(const Key('home-tabs-bar')), findsNothing);
expect(find.byKey(const Key('home-tabs-bar')).hitTestable(), findsNothing);
await tester.tap(find.byKey(const Key('player-back')));
await tester.pumpAndSettle();
});