Skip to content

Commit 38dcf7f

Browse files
committed
todo search was complated.
1 parent e7b6484 commit 38dcf7f

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

lib/products/viewmodels/navbar_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class NavbarViewModel extends ChangeNotifier with BaseSingleton {
2626
List<NavbarModel> get items => _items;
2727

2828
final List<Widget> _views = [
29-
const TodosView(),
29+
TodosView(),
3030
const DoneTodosView(),
3131
const ProfileView()
3232
];

lib/products/viewmodels/todo_view_model.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import '../../core/helpers/token.dart';
99
class TodoViewModel extends ChangeNotifier {
1010
List<TodoModel> _todoList = [];
1111
List<TodoModel> get todoList => _todoList;
12+
List<TodoModel> _searchList = [];
13+
List<TodoModel> get searchList => _searchList;
1214
final FirebaseFirestore _fireStore = FirebaseFirestore.instance;
1315

1416
Future<void> get getTodos async {
@@ -31,4 +33,20 @@ class TodoViewModel extends ChangeNotifier {
3133
notifyListeners();
3234
}
3335
}
36+
37+
void searchTodo(String query) {
38+
if (query.isNotEmpty) {
39+
final suggestions = todoList.where((todo) {
40+
final todoTitle = todo.title?.toLowerCase();
41+
final todoSubtitle = todo.subtitle?.toLowerCase();
42+
final input = query.toLowerCase();
43+
if (todoTitle != null && todoSubtitle != null) {
44+
return todoTitle.contains(input) || todoSubtitle.contains(input);
45+
}
46+
return false;
47+
}).toList();
48+
_searchList = suggestions;
49+
}
50+
notifyListeners();
51+
}
3452
}

lib/products/views/home/todos_view.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import '../../models/todo_model.dart';
1111
import '../../viewmodels/todo_view_model.dart';
1212

1313
class TodosView extends StatelessWidget with BaseSingleton {
14-
const TodosView({super.key});
14+
final _todoController = TextEditingController();
15+
TodosView({super.key});
1516

1617
@override
1718
Widget build(BuildContext context) {
@@ -29,12 +30,13 @@ class TodosView extends StatelessWidget with BaseSingleton {
2930
default:
3031
return Consumer<TodoViewModel>(
3132
builder: (context, pv, _) {
33+
bool shrinkWrap = true;
3234
return FadeInLeft(
3335
child: ListView(
3436
padding: context.padding2x,
35-
shrinkWrap: true,
37+
shrinkWrap: shrinkWrap,
3638
children: [
37-
_searchField(context),
39+
_searchField(context,pv),
3840
context.emptySizedHeightBox3x,
3941
_todos(context, pv)
4042
],
@@ -54,26 +56,34 @@ class TodosView extends StatelessWidget with BaseSingleton {
5456
);
5557
}
5658

57-
DefaultTextFormField _searchField(BuildContext context) {
59+
DefaultTextFormField _searchField(BuildContext context,TodoViewModel pv) {
5860
bool filled = true;
5961
return DefaultTextFormField(
6062
context: context,
6163
filled: filled,
6264
fillColor: colors.white,
6365
labelText: AppLocalizations.of(context)!.searchTodo,
6466
prefixIcon: icons.search,
67+
controller: _todoController,
68+
onChanged: pv.searchTodo,
6569
);
6670
}
6771

6872
ListView _todos(BuildContext context, TodoViewModel pv) {
6973
bool shrinkWrap = true;
7074
int todoLength = pv.todoList.length;
75+
if (_todoController.text.isNotEmpty) {
76+
todoLength = pv.searchList.length;
77+
}
7178
return ListView.separated(
7279
shrinkWrap: shrinkWrap,
7380
// TODO: ADD CORE STRUCTURE
7481
physics: const NeverScrollableScrollPhysics(),
7582
itemBuilder: (context, index) {
7683
TodoModel todo = pv.todoList[index];
84+
if (_todoController.text.isNotEmpty) {
85+
todo = pv.searchList[index];
86+
}
7787
return _todo(context, todo);
7888
},
7989
separatorBuilder: (_, __) => context.emptySizedHeightBox3x,

0 commit comments

Comments
 (0)