From daee0c03e001b0572a05a9f6e408e3f6ac44996d Mon Sep 17 00:00:00 2001 From: kilowatt Date: Sun, 1 Nov 2020 00:04:27 +0300 Subject: [PATCH] Android TV support - search screen --- lib/ui/search.dart | 50 +++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/lib/ui/search.dart b/lib/ui/search.dart index f60b8b9..d7d3293 100644 --- a/lib/ui/search.dart +++ b/lib/ui/search.dart @@ -1,5 +1,6 @@ import 'package:connectivity/connectivity.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/src/services/keyboard_key.dart'; import 'package:freezer/api/cache.dart'; import 'package:freezer/api/download.dart'; import 'package:freezer/api/player.dart'; @@ -121,6 +122,7 @@ class _SearchScreenState extends State { @override Widget build(BuildContext context) { + var textFielFocusNode = FocusNode(); return Scaffold( appBar: FreezerAppBar('Search'.i18n), body: ListView( @@ -134,24 +136,36 @@ class _SearchScreenState extends State { child: Stack( alignment: Alignment(1.0, 0.0), children: [ - TextField( - onChanged: (String s) { - setState(() => _query = s); - _loadSuggestions(); - }, - decoration: InputDecoration( - labelText: 'Search or paste URL'.i18n, - fillColor: Theme.of(context).bottomAppBarColor, - filled: true, - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey) - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey) - ), - ), - controller: _controller, - onSubmitted: (String s) => _submit(context, query: s), + RawKeyboardListener( + focusNode: FocusNode(), + onKey: (event) { // For Android TV: quit search textfield + if (event.runtimeType.toString() == 'RawKeyUpEvent') { + LogicalKeyboardKey key = event.data.logicalKey; + if (key == LogicalKeyboardKey.arrowDown) { + textFielFocusNode.unfocus(); + } + } + }, + child: TextField( + onChanged: (String s) { + setState(() => _query = s); + _loadSuggestions(); + }, + focusNode: textFielFocusNode, + decoration: InputDecoration( + labelText: 'Search or paste URL'.i18n, + fillColor: Theme.of(context).bottomAppBarColor, + filled: true, + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.grey) + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.grey) + ), + ), + controller: _controller, + onSubmitted: (String s) => _submit(context, query: s), + ) ), Row( mainAxisSize: MainAxisSize.min,