feat: done slicing search
This commit is contained in:
parent
e2d801b8a5
commit
baee8e35db
|
@ -8,6 +8,7 @@ import 'package:quiz_app/feature/navigation/bindings/navigation_binding.dart';
|
||||||
import 'package:quiz_app/feature/navigation/views/navbar_view.dart';
|
import 'package:quiz_app/feature/navigation/views/navbar_view.dart';
|
||||||
import 'package:quiz_app/feature/register/binding/register_binding.dart';
|
import 'package:quiz_app/feature/register/binding/register_binding.dart';
|
||||||
import 'package:quiz_app/feature/register/view/register_page.dart';
|
import 'package:quiz_app/feature/register/view/register_page.dart';
|
||||||
|
import 'package:quiz_app/feature/search/binding/search_binding.dart';
|
||||||
import 'package:quiz_app/feature/splash_screen/presentation/splash_screen_page.dart';
|
import 'package:quiz_app/feature/splash_screen/presentation/splash_screen_page.dart';
|
||||||
|
|
||||||
part 'app_routes.dart';
|
part 'app_routes.dart';
|
||||||
|
@ -40,6 +41,7 @@ class AppPages {
|
||||||
bindings: [
|
bindings: [
|
||||||
NavbarBinding(),
|
NavbarBinding(),
|
||||||
HomeBinding(),
|
HomeBinding(),
|
||||||
|
SearchBinding(),
|
||||||
],
|
],
|
||||||
middlewares: [AuthMiddleware()],
|
middlewares: [AuthMiddleware()],
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:quiz_app/feature/search/controller/search_controller.dart';
|
||||||
|
|
||||||
|
class SearchBinding extends Bindings {
|
||||||
|
@override
|
||||||
|
void dependencies() {
|
||||||
|
Get.lazyPut<SearchQuizController>(() => SearchQuizController());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class SearchQuizController extends GetxController {
|
||||||
|
final searchController = TextEditingController();
|
||||||
|
final searchText = ''.obs;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
searchController.addListener(() {
|
||||||
|
searchText.value = searchController.text;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onClose() {
|
||||||
|
searchController.dispose();
|
||||||
|
super.onClose();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,111 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:quiz_app/component/quiz_container_component.dart';
|
||||||
|
import 'package:quiz_app/feature/search/controller/search_controller.dart';
|
||||||
|
|
||||||
class SearchView extends StatelessWidget {
|
class SearchView extends GetView<SearchQuizController> {
|
||||||
const SearchView({super.key});
|
const SearchView({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold();
|
return Scaffold(
|
||||||
|
backgroundColor: const Color(0xFFF8F9FB),
|
||||||
|
body: SafeArea(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Obx(() {
|
||||||
|
final isSearching = controller.searchText.isNotEmpty;
|
||||||
|
|
||||||
|
return ListView(
|
||||||
|
children: [
|
||||||
|
_buildSearchBar(),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
if (isSearching) ...[
|
||||||
|
_buildCategoryFilter(),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
const Text(
|
||||||
|
"Result",
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
_buildQuizList(count: 5),
|
||||||
|
] else ...[
|
||||||
|
_buildSectionTitle("Rekomendasi Quiz"),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
_buildQuizList(),
|
||||||
|
const SizedBox(height: 30),
|
||||||
|
_buildSectionTitle("Quiz Populer"),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
_buildQuizList(),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildSearchBar() {
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(16),
|
||||||
|
boxShadow: const [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black12,
|
||||||
|
blurRadius: 6,
|
||||||
|
offset: Offset(0, 2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: TextField(
|
||||||
|
controller: controller.searchController,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
hintText: 'Cari quiz...',
|
||||||
|
border: InputBorder.none,
|
||||||
|
icon: Icon(Icons.search),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildCategoryFilter() {
|
||||||
|
final categories = ['Fisika', 'Matematika', 'Agama', 'English', 'Sejarah', 'Biologi'];
|
||||||
|
return Wrap(
|
||||||
|
spacing: 8,
|
||||||
|
runSpacing: 8,
|
||||||
|
children: categories.map((cat) {
|
||||||
|
return Chip(
|
||||||
|
label: Text(cat),
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
side: const BorderSide(color: Colors.black12),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildSectionTitle(String title) {
|
||||||
|
return Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
title,
|
||||||
|
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Lihat semua",
|
||||||
|
style: TextStyle(fontSize: 14, color: Colors.blue.shade700),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildQuizList({int count = 3}) {
|
||||||
|
return Column(
|
||||||
|
children: List.generate(count, (_) => const QuizContainerComponent()),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue