Fix search screen not properly clearing results on profile swap

codemagic-setup
Hank Grabowski 2023-11-16 19:15:41 -05:00
rodzic 034343936e
commit a536576a83
1 zmienionych plików z 25 dodań i 12 usunięć

Wyświetl plik

@ -35,11 +35,12 @@ class SearchScreen extends StatefulWidget {
class _SearchScreenState extends State<SearchScreen> { class _SearchScreenState extends State<SearchScreen> {
static const limit = 50; static const limit = 50;
static final _logger = Logger('$SearchScreen'); static final _logger = Logger('$SearchScreen');
var searchText = ''; var searchTextController = TextEditingController();
var searchType = SearchTypes.statusesText; var searchType = SearchTypes.statusesText;
var searching = false; var searching = false;
PagingData nextPage = PagingData(limit: limit); PagingData nextPage = PagingData(limit: limit);
var searchResult = SearchResults.empty(); var searchResult = SearchResults.empty();
Profile? profileOfSearchRequest;
PagingData genNextPageData() { PagingData genNextPageData() {
late final int offset; late final int offset;
@ -71,13 +72,14 @@ class _SearchScreenState extends State<SearchScreen> {
searching = true; searching = true;
}); });
print('Search $searchType on $searchText'); print('Search $searchType on ${searchTextController.text}');
final result = final result = await SearchClient(profile)
await SearchClient(profile).search(searchType, searchText, nextPage); .search(searchType, searchTextController.text, nextPage);
result.match( result.match(
onSuccess: (result) { onSuccess: (result) {
searchResult = reset ? result.data : searchResult.merge(result.data); searchResult = reset ? result.data : searchResult.merge(result.data);
nextPage = result.next ?? genNextPageData(); nextPage = result.next ?? genNextPageData();
profileOfSearchRequest = profile;
}, },
onError: (error) => onError: (error) =>
buildSnackbar(context, 'Error getting search result: $error'), buildSnackbar(context, 'Error getting search result: $error'),
@ -88,6 +90,15 @@ class _SearchScreenState extends State<SearchScreen> {
print('Ending update'); print('Ending update');
} }
clearSearchResults() {
print('Clearing results');
setState(() {
searchResult = SearchResults.empty();
searchTextController.text = '';
searching = false;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_logger.info('Build'); _logger.info('Build');
@ -96,13 +107,17 @@ class _SearchScreenState extends State<SearchScreen> {
final profile = profileService.currentProfile; final profile = profileService.currentProfile;
late Widget body; late Widget body;
if (profile != profileOfSearchRequest) {
clearSearchResults();
}
if (searchResult.isEmpty && searching) { if (searchResult.isEmpty && searching) {
body = Center( body = Center(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text( Text(
'Searching for ${searchType.toLabel()} on: $searchText', 'Searching for ${searchType.toLabel()} on: ${searchTextController.text}',
), ),
], ],
), ),
@ -112,7 +127,7 @@ class _SearchScreenState extends State<SearchScreen> {
} }
return Scaffold( return Scaffold(
drawer: const StandardAppDrawer(skipPopDismiss: true), drawer: const StandardAppDrawer(skipPopDismiss: false),
body: SafeArea( body: SafeArea(
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: () async { onRefresh: () async {
@ -132,11 +147,9 @@ class _SearchScreenState extends State<SearchScreen> {
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: TextField( child: TextField(
onChanged: (value) { controller: searchTextController,
searchText = value;
},
onSubmitted: (value) { onSubmitted: (value) {
searchText = value; searchTextController.text = value;
updateSearchResults(profile); updateSearchResults(profile);
}, },
onTapOutside: (event) { onTapOutside: (event) {
@ -293,9 +306,9 @@ class _SearchScreenState extends State<SearchScreen> {
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text(searchText.isEmpty Text(searchTextController.text.isEmpty
? 'Type search text to search' ? 'Type search text to search'
: 'No results for ${searchType.toLabel()} search on: $searchText'), : 'No results for ${searchType.toLabel()} search on: ${searchTextController.text}'),
], ],
), ),
); );