Advertisement
Vassa007

home_page sisca

Sep 4th, 2023
1,349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 8.64 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. import 'package:font_awesome_flutter/font_awesome_flutter.dart';
  4. import 'package:lottie/lottie.dart';
  5. import 'package:sisca/config/theme/dialog_helper.dart';
  6. import 'package:sisca/presentation/home/ui/widget/textfield_search.dart';
  7. import 'package:sisca/presentation/peserta/ui/peserta_page.dart';
  8. import 'package:sisca/config/preferences/sisca_preferences.dart';
  9. import 'package:sisca/presentation/home/ui/widget/card_event.dart';
  10.  
  11. import '../../../config/preferences/constant.dart';
  12. import '../../../config/preferences/global_value.dart';
  13. import '../../../config/theme/light_colors.dart';
  14. import '../../error/error_screen.dart';
  15. import '../../peserta/data/model/argument_peserta.dart';
  16. import '../bloc/home_bloc.dart';
  17. import '../data/model/event_model.dart';
  18.  
  19. class HomePage extends StatefulWidget {
  20.   const HomePage({super.key});
  21.  
  22.   @override
  23.   State<HomePage> createState() => _HomePageState();
  24. }
  25.  
  26. class _HomePageState extends State<HomePage> {
  27.   late List<EventModel> _eventList = [];
  28.   late List<EventModel> _searchResult = [];
  29.   late TextEditingController textController = TextEditingController();
  30.  
  31.   @override
  32.   void initState() {
  33.     BlocProvider.of<HomeBloc>(context).add(HomeSendData());
  34.     super.initState();
  35.   }
  36.  
  37.   @override
  38.   Widget build(BuildContext context) {
  39.     Size size = MediaQuery.of(context).size;
  40.     String username = GlobalValue.getUsername(TAG_USERNAME)!;
  41.     return Scaffold(
  42.       body: SafeArea(
  43.         child: ListView(
  44.           children: [
  45.             /// header
  46.             Padding(
  47.               padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
  48.               child: Row(
  49.                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
  50.                 children: [
  51.                   Column(
  52.                     mainAxisAlignment: MainAxisAlignment.start,
  53.                     crossAxisAlignment: CrossAxisAlignment.start,
  54.                     children: [
  55.                       Text(
  56.                         "Hallo, $username",
  57.                         style: const TextStyle(
  58.                             fontWeight: FontWeight.w600,
  59.                             fontSize: 22.0,
  60.                             color: LightColors.kRed),
  61.                       ),
  62.                       Text(
  63.                         "Petugas Presensi",
  64.                         style: const TextStyle(
  65.                             fontSize: 14.0,
  66.                             color: Colors.black54),
  67.                       ),
  68.                     ],
  69.                   ),
  70.                   InkWell(
  71.                     child: Container(
  72.                       width: 60,
  73.                       height: 60,
  74.                       decoration: BoxDecoration(
  75.                         shape: BoxShape.circle,
  76.                         image: DecorationImage(
  77.                             image: NetworkImage(
  78.                                 'https://images.pixexid.com/a-persons-face-expressing-a-sense-of-wonder-and-curiosity-as-they-explore-a-new-3rjuuksg.webp?h=700&q=70'),
  79.                             fit: BoxFit.cover),
  80.                         border: Border.all(width: 4, color: Colors.black38)
  81.                       ),
  82.                     ),
  83.                     onTap: () {
  84.                       DialogHelper.showLogoutDialog(context, "Keluar Aplikasi",
  85.                           "Apakah anda yakin akan keluar aplikasi?");
  86.                     },
  87.                   )
  88.                 ],
  89.               ),
  90.             ),
  91.  
  92.             /// Event list
  93.             BlocConsumer<HomeBloc, HomeState>(
  94.               builder: (context, state) {
  95.                 if (state is HomeLoad) {
  96.                   if (state.data.isNotEmpty) {
  97.                     _eventList = state.data;
  98.                   } else {
  99.                     return Center(
  100.                       child: Container(
  101.                         margin: const EdgeInsets.symmetric(vertical: 50),
  102.                         child: const Text(
  103.                           "Event kosong",
  104.                           style: TextStyle(
  105.                             color: Colors.black45,
  106.                             fontWeight: FontWeight.w400,
  107.                           ),
  108.                         ),
  109.                       ),
  110.                     );
  111.                   }
  112.                 } else if (state is HomeLoading) {
  113.                   return Center(
  114.                       child: Container(
  115.                         margin: const EdgeInsets.symmetric(vertical: 50),
  116.                         child: Container(
  117.                           width: 175,
  118.                           height: 175,
  119.                           child: Lottie.asset('assets/lottie/animated_loading.json'),
  120.                         ),
  121.                       ));
  122.                 } else if (state is ErrorEvent) {
  123.                   return ErrorScreenBuilder(errorMessage: state.errorMessage);
  124.                 }
  125.  
  126.                 return _buildLayout(size);
  127.               },
  128.               listener: (context, state) {},
  129.             ),
  130.           ],
  131.         ),
  132.       ),
  133.     );
  134.   }
  135.  
  136.   Widget _buildLayout(Size size) {
  137.     return Column(
  138.       children: [
  139.         /// filed pencarian
  140.         TextFieldSearch(
  141.           size: size,
  142.           textController: textController,
  143.           hintText: 'Cari event disini',
  144.           icoton: textController.text.isEmpty ? IconButton(
  145.               onPressed: () {},
  146.               icon: const Icon(
  147.                 FontAwesomeIcons.search,
  148.                 color: Colors.black54,
  149.               )): IconButton(
  150.               onPressed: () {
  151.                 textController.clear();
  152.                 setState(() {
  153.                   _searchResult = _eventList;
  154.                 });
  155.               },
  156.               icon: const Icon(
  157.                 FontAwesomeIcons.close,
  158.                 color: Colors.black54,
  159.               )),
  160.           onChangedText: onSearchTextChanged,
  161.         ),
  162.         const SizedBox(
  163.           height: 20,
  164.         ),
  165.  
  166.         Container(
  167.           width: size.width * 0.95,
  168.           alignment: Alignment.topLeft,
  169.           margin: const EdgeInsets.symmetric(horizontal: 10),
  170.           // margin: const EdgeInsets.fromLTRB(20.0, 5.0, 100.0, 5.0),
  171.           decoration: const BoxDecoration(
  172.             borderRadius: BorderRadius.all(Radius.circular(12)),
  173.             color: LightColors.kRed,
  174.           ),
  175.           child: const Padding(
  176.             padding: EdgeInsets.all(10),
  177.             child: Text(
  178.               "Daftar Event",
  179.               style: TextStyle(
  180.                 fontSize: 18.0,
  181.                 color: Colors.white,
  182.                 fontWeight: FontWeight.w500,
  183.               ),
  184.             ),
  185.           ),
  186.         ),
  187.         _eventListView(size)
  188.       ],
  189.     );
  190.   }
  191.  
  192.   Widget _eventListView(Size size) {
  193.     return _searchResult.isNotEmpty
  194.         ? ListView.builder(
  195.             shrinkWrap: true,
  196.             physics: const NeverScrollableScrollPhysics(),
  197.             itemCount: _searchResult.length,
  198.             itemBuilder: (context, index) {
  199.               return _eventListItems(_searchResult[index], size);
  200.             },
  201.           )
  202.         : ListView.builder(
  203.             shrinkWrap: true,
  204.             physics: const NeverScrollableScrollPhysics(),
  205.             itemCount: _eventList.length,
  206.             itemBuilder: (context, index) {
  207.               return _eventListItems(_eventList[index], size);
  208.             },
  209.           );
  210.   }
  211.  
  212.   Widget _eventListItems(EventModel eventList, Size size) {
  213.     return Container(
  214.       padding: const EdgeInsets.symmetric(horizontal:10, vertical: 5),
  215.       child: CardEvent(
  216.         size: size,
  217.         title: eventList.title!,
  218.         peserta: eventList.peserta!,
  219.         lokasi: eventList.lokasi!,
  220.         start: eventList.time_start!,
  221.         finish: eventList.time_finish!,
  222.         onTapEvent: () {
  223.           print(eventList.idEvent);
  224.           String? jenis = "";
  225.           String? status = eventList.status_acara;
  226.           String? id = eventList.idEvent;
  227.           Navigator.pushNamed(context, '/peserta',
  228.               arguments: PesertaArgument(
  229.                 id,
  230.                 status,
  231.                 jenis,
  232.               ));
  233.         },
  234.       ),
  235.     );
  236.   }
  237.  
  238.   //fungsi pencarian
  239.   onSearchTextChanged(String text) {
  240.     List<EventModel> _results = <EventModel>[];
  241.  
  242.     if (text.isEmpty) {
  243.       _results = _eventList;
  244.     } else {
  245.       _results = _eventList
  246.           .where((event) =>
  247.               event.title!.toLowerCase().contains(text.toLowerCase()))
  248.           .toList();
  249.     }
  250.  
  251.     setState(() {
  252.       _searchResult = _results;
  253.     });
  254.     return;
  255.   }
  256. }
  257.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement