diff --git a/lib/focus/focusable_action_bar.dart b/lib/focus/focusable_action_bar.dart index 4bf63ab4..2b8ca542 100644 --- a/lib/focus/focusable_action_bar.dart +++ b/lib/focus/focusable_action_bar.dart @@ -88,8 +88,12 @@ class FocusableActionBarState extends State { late List _focusNodes; late List _focusStates; - /// Access a focus node by index (e.g. for external `requestFocus()` calls). - FocusNode getFocusNode(int index) => _focusNodes[index]; + FocusNode? getFocusNode(int index) => + index >= 0 && index < _focusNodes.length ? _focusNodes[index] : null; + + void requestFocusOnFirst() { + if (_focusNodes.isNotEmpty) _focusNodes.first.requestFocus(); + } @override void initState() { diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 22786261..07cd7265 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -188,7 +188,7 @@ class _DiscoverScreenState extends State if (_isHeroSectionVisible) { _heroFocusNode.requestFocus(); } else { - _actionBarKey.currentState?.getFocusNode(0).requestFocus(); + _actionBarKey.currentState?.requestFocusOnFirst(); } _scrollToTop(); } @@ -275,7 +275,7 @@ class _DiscoverScreenState extends State final keys = _allHubKeys; if (keys.isNotEmpty) keys.first.currentState?.requestFocusFromMemory(); }, - onUp: () => _actionBarKey.currentState?.getFocusNode(0).requestFocus(), + onUp: () => _actionBarKey.currentState?.requestFocusOnFirst(), onLeft: () { if (_currentHeroIndex > 0) { _heroController.previousPage(duration: tokens(context).slow, curve: Curves.easeInOut); @@ -824,7 +824,7 @@ class _DiscoverScreenState extends State final actionBar = _actionBarKey.currentState; if (actionBar == null) return; final lastNode = actionBar.getFocusNode(actionBar.widget.actions.length - 1); - final RenderBox? button = lastNode.context?.findRenderObject() as RenderBox?; + final RenderBox? button = lastNode?.context?.findRenderObject() as RenderBox?; if (button == null) return; final RenderBox overlay = Navigator.of(context).overlay!.context.findRenderObject() as RenderBox; diff --git a/lib/screens/focusable_detail_screen_mixin.dart b/lib/screens/focusable_detail_screen_mixin.dart index 69a05c0d..423ae107 100644 --- a/lib/screens/focusable_detail_screen_mixin.dart +++ b/lib/screens/focusable_detail_screen_mixin.dart @@ -47,10 +47,7 @@ mixin FocusableDetailScreenMixin on State, GridFocu setState(() { isAppBarFocused = true; }); - final state = actionBarKey.currentState; - if (state != null && getAppBarActions().isNotEmpty) { - state.getFocusNode(0).requestFocus(); - } + actionBarKey.currentState?.requestFocusOnFirst(); // Scroll to top to show the app bar scrollController.animateTo(0, duration: const Duration(milliseconds: 200), curve: Curves.easeOut); } diff --git a/lib/screens/libraries/libraries_screen.dart b/lib/screens/libraries/libraries_screen.dart index 9678ee08..47aa5fe2 100644 --- a/lib/screens/libraries/libraries_screen.dart +++ b/lib/screens/libraries/libraries_screen.dart @@ -821,7 +821,7 @@ class _LibrariesScreenState extends State i, onSelectWhenActive: _focusCurrentTab, onNavigateDown: _focusCurrentTabFromTabBar, - onNavigateRightFromLast: () => _actionBarKey.currentState?.getFocusNode(0).requestFocus(), + onNavigateRightFromLast: () => _actionBarKey.currentState?.requestFocusOnFirst(), ), ], ], @@ -965,7 +965,7 @@ class _LibrariesScreenState extends State i, onSelectWhenActive: _focusCurrentTab, onNavigateDown: _focusCurrentTabFromTabBar, - onNavigateRightFromLast: () => _actionBarKey.currentState?.getFocusNode(0).requestFocus(), + onNavigateRightFromLast: () => _actionBarKey.currentState?.requestFocusOnFirst(), ), ], ], diff --git a/lib/screens/livetv/live_tv_screen.dart b/lib/screens/livetv/live_tv_screen.dart index 9f539bdf..10bef130 100644 --- a/lib/screens/livetv/live_tv_screen.dart +++ b/lib/screens/livetv/live_tv_screen.dart @@ -339,7 +339,7 @@ class _LiveTvScreenState extends State i, onSelectWhenActive: _focusCurrentTab, onNavigateDown: _focusCurrentTab, - onNavigateRightFromLast: () => _actionBarKey.currentState?.getFocusNode(0).requestFocus(), + onNavigateRightFromLast: () => _actionBarKey.currentState?.requestFocusOnFirst(), ), ], ], @@ -421,7 +421,7 @@ class _LiveTvScreenState extends State i, onSelectWhenActive: _focusCurrentTab, onNavigateDown: _focusCurrentTab, - onNavigateRightFromLast: () => _actionBarKey.currentState?.getFocusNode(0).requestFocus(), + onNavigateRightFromLast: () => _actionBarKey.currentState?.requestFocusOnFirst(), ), ], ],