2 Commits

Author SHA1 Message Date
c7c5b3682d added functionality to clear search text
All checks were successful
Flutter APK Build / Build Flutter APK (push) Successful in 6m38s
2026-01-21 12:27:52 +01:00
321a310add added function to remove search text 2026-01-21 12:16:37 +01:00
4 changed files with 42 additions and 12 deletions

View File

@@ -17,6 +17,7 @@ class SearchPage extends StatelessWidget {
children: [ children: [
SearchBarWidget( SearchBarWidget(
onEditingComplete: context.read<SearchProvider>().setSearchText, onEditingComplete: context.read<SearchProvider>().setSearchText,
onResetSearch: context.read<SearchProvider>().removeSearchText,
), ),
Expanded(child: SearchResultsWidget()), Expanded(child: SearchResultsWidget()),
], ],

View File

@@ -8,5 +8,10 @@ class SearchProvider extends ChangeNotifier {
if (!silent) notifyListeners(); if (!silent) notifyListeners();
} }
void removeSearchText({bool silent = false}) {
_searchText = '';
if (!silent) notifyListeners();
}
String get searchText => _searchText; String get searchText => _searchText;
} }

View File

@@ -1,16 +1,34 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class SearchBarWidget extends StatelessWidget { class SearchBarWidget extends StatelessWidget {
const SearchBarWidget({super.key, required this.onEditingComplete}); const SearchBarWidget({
super.key,
required this.onEditingComplete,
required this.onResetSearch,
});
final Function(String searchString) onEditingComplete; final Function(String searchString) onEditingComplete;
final Function() onResetSearch;
@override
Widget build(BuildContext context) {
return TextField(onChanged: (text) => onChanged(text, context));
}
void onChanged(String text, BuildContext context) { void onChanged(String text, BuildContext context) {
if (context.mounted) onEditingComplete(text); if (context.mounted) onEditingComplete(text);
} }
@override
Widget build(BuildContext context) {
final searchTextController = TextEditingController();
return TextField(
controller: searchTextController,
onChanged: (text) => onChanged(text, context),
decoration: InputDecoration(
suffixIcon: IconButton(
onPressed: () {
searchTextController.clear();
onResetSearch();
},
icon: Icon(Icons.delete_outline_outlined),
),
),
);
}
} }

View File

@@ -17,6 +17,12 @@ class SearchResultsWidget extends StatefulWidget {
class _SearchResultsWidgetState extends State<SearchResultsWidget> { class _SearchResultsWidgetState extends State<SearchResultsWidget> {
final List<Bookmark> allBookmarks = Storage.loadBookmarks(); final List<Bookmark> allBookmarks = Storage.loadBookmarks();
@override
void deactivate() {
context.read<SearchProvider>().removeSearchText(silent: true);
super.deactivate();
}
Widget bookmarkListItemBuilder(BuildContext context, int index) { Widget bookmarkListItemBuilder(BuildContext context, int index) {
final bookmark = filteredBookmarks.elementAt(index); final bookmark = filteredBookmarks.elementAt(index);
return ListTile( return ListTile(
@@ -31,6 +37,12 @@ class _SearchResultsWidgetState extends State<SearchResultsWidget> {
); );
} }
Iterable<Bookmark> get filteredBookmarks => allBookmarks.where(
(bookmark) => bookmark.name.toLowerCase().contains(
context.watch<SearchProvider>().searchText.toLowerCase(),
),
);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (filteredBookmarks.isNotEmpty) { if (filteredBookmarks.isNotEmpty) {
@@ -41,10 +53,4 @@ class _SearchResultsWidgetState extends State<SearchResultsWidget> {
} }
return Center(child: Text('Start searching')); return Center(child: Text('Start searching'));
} }
Iterable<Bookmark> get filteredBookmarks => allBookmarks.where(
(bookmark) => bookmark.name.toLowerCase().contains(
context.watch<SearchProvider>().searchText.toLowerCase(),
),
);
} }