fix(tv): trap d-pad focus at button row edges

close #1181
This commit is contained in:
edde746
2026-05-29 03:31:53 +02:00
parent a931d5910b
commit 097e48d705
4 changed files with 311 additions and 8 deletions
+11 -1
View File
@@ -1013,6 +1013,9 @@ class _MediaDetailScreenState extends State<MediaDetailScreen>
if (key.isUpKey) {
return KeyEventResult.handled; // consume — nothing above
}
if (key.isLeftKey || key.isRightKey) {
return KeyEventResult.handled; // consume — single chip, nothing beside it (#1181)
}
return KeyEventResult.ignored;
},
child: GestureDetector(
@@ -2001,7 +2004,7 @@ class _MediaDetailScreenState extends State<MediaDetailScreen>
}
/// Intercept DOWN from the play button row to focus the first available section
KeyEventResult _handlePlayButtonKeyEvent(FocusNode _, KeyEvent event) {
KeyEventResult _handlePlayButtonKeyEvent(FocusNode node, KeyEvent event) {
final key = event.logicalKey;
if (!event.isActionable) return KeyEventResult.ignored;
final isTv = PlatformDetector.isTV();
@@ -2019,6 +2022,13 @@ class _MediaDetailScreenState extends State<MediaDetailScreen>
return KeyEventResult.handled;
}
// LEFT/RIGHT: let the framework move between buttons in the row, but trap
// at the row's edges so focus can't fall off into a black hole (#1181).
if (key.isLeftKey || key.isRightKey) {
final dir = key.isRightKey ? TraversalDirection.right : TraversalDirection.left;
return hasHorizontalNeighbor(node, dir) ? KeyEventResult.ignored : KeyEventResult.handled;
}
if (!key.isDownKey) return KeyEventResult.ignored;
final metadata = _fullMetadata ?? _metadata;