fix: Make filter input field auto-lose focus when entering room view
This commit is contained in:
		| @ -1,7 +1,7 @@ | |||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter_gen/gen_l10n/l10n.dart'; | import 'package:flutter_gen/gen_l10n/l10n.dart'; | ||||||
|  |  | ||||||
| class DefaultAppBarSearchField extends StatelessWidget { | class DefaultAppBarSearchField extends StatefulWidget { | ||||||
|   final TextEditingController searchController; |   final TextEditingController searchController; | ||||||
|   final void Function(String) onChanged; |   final void Function(String) onChanged; | ||||||
|   final Widget suffix; |   final Widget suffix; | ||||||
| @ -13,9 +13,45 @@ class DefaultAppBarSearchField extends StatelessWidget { | |||||||
|     this.suffix, |     this.suffix, | ||||||
|   }) : super(key: key); |   }) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   _DefaultAppBarSearchFieldState createState() => | ||||||
|  |       _DefaultAppBarSearchFieldState(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class _DefaultAppBarSearchFieldState extends State<DefaultAppBarSearchField> { | ||||||
|  |   final FocusNode _focusNode = FocusNode(); | ||||||
|  |   TextEditingController _searchController; | ||||||
|  |   bool _lastTextWasEmpty = false; | ||||||
|  |  | ||||||
|  |   void _updateSearchController() { | ||||||
|  |     final thisTextIsEmpty = _searchController.text?.isEmpty ?? false; | ||||||
|  |     if (_lastTextWasEmpty != thisTextIsEmpty) { | ||||||
|  |       setState(() => _lastTextWasEmpty = thisTextIsEmpty); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   void initState() { | ||||||
|  |     super.initState(); | ||||||
|  |     _searchController = widget.searchController ?? TextEditingController(); | ||||||
|  |     // we need to remove the listener in the dispose method, so we need a reference to the callback | ||||||
|  |     _searchController.addListener(_updateSearchController); | ||||||
|  |     _focusNode.addListener(() => setState(() => null)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   void dispose() { | ||||||
|  |     _focusNode.dispose(); | ||||||
|  |     _searchController.removeListener(_updateSearchController); | ||||||
|  |     if (widget.searchController == null) { | ||||||
|  |       // we need to dispose our own created searchController | ||||||
|  |       _searchController.dispose(); | ||||||
|  |     } | ||||||
|  |     super.dispose(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     final focusNode = FocusNode(); |  | ||||||
|     return Container( |     return Container( | ||||||
|       height: 40, |       height: 40, | ||||||
|       padding: EdgeInsets.only(right: 16), |       padding: EdgeInsets.only(right: 16), | ||||||
| @ -24,9 +60,9 @@ class DefaultAppBarSearchField extends StatelessWidget { | |||||||
|         borderRadius: BorderRadius.circular(32), |         borderRadius: BorderRadius.circular(32), | ||||||
|         child: TextField( |         child: TextField( | ||||||
|           autocorrect: false, |           autocorrect: false, | ||||||
|           controller: searchController, |           controller: _searchController, | ||||||
|           onChanged: onChanged, |           onChanged: widget.onChanged, | ||||||
|           focusNode: focusNode, |           focusNode: _focusNode, | ||||||
|           decoration: InputDecoration( |           decoration: InputDecoration( | ||||||
|             contentPadding: EdgeInsets.only( |             contentPadding: EdgeInsets.only( | ||||||
|               top: 8, |               top: 8, | ||||||
| @ -37,15 +73,17 @@ class DefaultAppBarSearchField extends StatelessWidget { | |||||||
|               borderRadius: BorderRadius.circular(32), |               borderRadius: BorderRadius.circular(32), | ||||||
|             ), |             ), | ||||||
|             hintText: L10n.of(context).searchForAChat, |             hintText: L10n.of(context).searchForAChat, | ||||||
|             suffixIcon: focusNode.hasFocus |             suffixIcon: _focusNode.hasFocus || | ||||||
|  |                     (widget.suffix == null && | ||||||
|  |                         (_searchController.text?.isNotEmpty ?? false)) | ||||||
|                 ? IconButton( |                 ? IconButton( | ||||||
|                     icon: Icon(Icons.backspace_outlined), |                     icon: Icon(Icons.backspace_outlined), | ||||||
|                     onPressed: () { |                     onPressed: () { | ||||||
|                       searchController.clear(); |                       _searchController.clear(); | ||||||
|                       focusNode.unfocus(); |                       _focusNode.unfocus(); | ||||||
|                     }, |                     }, | ||||||
|                   ) |                   ) | ||||||
|                 : suffix, |                 : widget.suffix, | ||||||
|           ), |           ), | ||||||
|         ), |         ), | ||||||
|       ), |       ), | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user