menus.dart 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:vitalapp/pages/home/controller.dart';
  4. import 'package:vitalapp/pages/home/models/menu.dart';
  5. class HomeMenuListViewWidget extends StatelessWidget {
  6. final List<HomeMenuItem> source;
  7. final ScrollController? scrollerController;
  8. final String? currentSelectMenu;
  9. const HomeMenuListViewWidget({
  10. super.key,
  11. required this.source,
  12. this.scrollerController,
  13. this.currentSelectMenu = '/medicals',
  14. });
  15. @override
  16. Widget build(BuildContext context) {
  17. return ListView.builder(
  18. shrinkWrap: true,
  19. controller: scrollerController,
  20. itemCount: source.length,
  21. itemBuilder: (_, index) {
  22. return HomeMenuItemWidget(
  23. data: source[index],
  24. );
  25. },
  26. );
  27. }
  28. }
  29. class HomeMenuItemWidget extends StatelessWidget {
  30. final HomeMenuItem data;
  31. const HomeMenuItemWidget({super.key, required this.data});
  32. @override
  33. Widget build(BuildContext context) {
  34. final homeController = Get.find<HomeController>();
  35. final isSelect = data.routeName == homeController.state.currentSelectMenu;
  36. Widget child = _buildBody();
  37. if (isSelect) {
  38. child = Stack(
  39. children: [
  40. Container(width: 4, color: Colors.white),
  41. Positioned.fill(child: child),
  42. ],
  43. );
  44. }
  45. return Container(
  46. width: 120,
  47. height: 75,
  48. color: isSelect ? Colors.black.withOpacity(0.2333) : null,
  49. child: child,
  50. );
  51. }
  52. Widget _buildBody() {
  53. return Ink(
  54. color: Colors.white,
  55. child: InkWell(
  56. splashColor: Colors.cyanAccent,
  57. onTap: () {
  58. Get.find<HomeController>().switchActiveMenu(data);
  59. },
  60. child: Column(
  61. crossAxisAlignment: CrossAxisAlignment.center,
  62. mainAxisAlignment: MainAxisAlignment.center,
  63. children: [
  64. data.iconWidget ??
  65. Icon(
  66. data.iconData,
  67. size: 32,
  68. color: Colors.white,
  69. ),
  70. const SizedBox(height: 4),
  71. Text(
  72. data.title,
  73. style: const TextStyle(color: Colors.white, fontSize: 16),
  74. ),
  75. ],
  76. ),
  77. ),
  78. );
  79. }
  80. }