added simple search feature

This commit is contained in:
2026-01-14 22:49:32 +01:00
parent 36e4eaee17
commit 143206cd72
4 changed files with 93 additions and 2 deletions

View File

@@ -7,6 +7,7 @@ import '../service/shared_link_provider.dart';
import '../service/storage.dart'; import '../service/storage.dart';
import '../widgets/create_bookmark_collection_dialog.dart'; import '../widgets/create_bookmark_collection_dialog.dart';
import 'collection_page.dart'; import 'collection_page.dart';
import 'search_page.dart' show SearchPage;
class CollectionsListPage extends StatefulWidget { class CollectionsListPage extends StatefulWidget {
const CollectionsListPage({super.key}); const CollectionsListPage({super.key});
@@ -88,6 +89,12 @@ class _CollectionsListPageState extends State<CollectionsListPage> {
TextButton( TextButton(
onPressed: () => provider.removeCurrentMapsLink(), onPressed: () => provider.removeCurrentMapsLink(),
child: Text('Cancel'), child: Text('Cancel'),
)
else
IconButton(
onPressed: () =>
Navigator.of(context).pushNamed(SearchPage.routeName),
icon: Icon(Icons.search),
), ),
], ],
), ),

View File

@@ -1,11 +1,43 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class SearchPage extends StatelessWidget { import '../model/bookmark.dart';
import '../service/storage.dart';
import '../widgets/search_widgets/search_bar_widget.dart';
import '../widgets/search_widgets/search_results_widget.dart';
class SearchPage extends StatefulWidget {
const SearchPage({super.key}); const SearchPage({super.key});
static const String routeName = '/search'; static const String routeName = '/search';
@override
State<SearchPage> createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
final List<Bookmark> allBookmarks = Storage.loadBookmarks();
String searchString = '';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Placeholder(); return Scaffold(
appBar: AppBar(title: Text('Search')),
body: Column(
children: [
SearchBarWidget(
onEditingComplete: (searchString) => setState(() {
this.searchString = searchString;
}),
),
Expanded(
child: SearchResultsWidget(
bookmarks: allBookmarks.where(
(bookmark) => bookmark.name.contains(searchString),
),
),
),
],
),
);
} }
} }

View File

@@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
class SearchBarWidget extends StatelessWidget {
const SearchBarWidget({super.key, required this.onEditingComplete});
final Function(String searchString) onEditingComplete;
@override
Widget build(BuildContext context) {
TextEditingController searchBarController = TextEditingController();
return TextField(
controller: searchBarController,
onEditingComplete: () => onEditingComplete(searchBarController.text),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import '../../model/bookmark.dart';
import '../../service/notifying.dart';
import '../../service/url_launcher.dart';
class SearchResultsWidget extends StatelessWidget {
const SearchResultsWidget({super.key, required this.bookmarks});
final Iterable<Bookmark> bookmarks;
Widget bookmarkListItemBuilder(BuildContext context, int index) {
final bookmark = bookmarks.elementAt(index);
return ListTile(
title: Text(bookmark.name),
onTap: () => launchUrlFromString(bookmark.link).then((errorCode) {
if (context.mounted && errorCode != UrlLaunchErrorCode.none) {
Notifying.showUrlErrorSnackbar(context, errorCode);
} else if (context.mounted) {
Navigator.of(context).pop();
}
}),
);
}
@override
Widget build(BuildContext context) {
if (bookmarks.isNotEmpty) {
return ListView.builder(
itemBuilder: bookmarkListItemBuilder,
itemCount: bookmarks.length,
);
}
return Center(child: Text('Start searching'));
}
}