home_screen.dart 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. import 'package:flutter/material.dart';
  2. import 'package:turquessa_mesas_hoster/utils/widgets/custom_appbar.dart';
  3. import 'package:turquessa_mesas_hoster/mvvm/views/home/categorias_navbar.dart';
  4. const List<Map<String, dynamic>> items = [
  5. {
  6. 'titulo': 'Hamburguesa de res',
  7. 'descripcion': 'Hamburguesa de res con queso cheddar',
  8. 'precio': '\$ 120.00',
  9. 'imageUrl':
  10. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  11. },
  12. {
  13. 'titulo': 'Hamburguesa de pollo',
  14. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  15. 'precio': '\$ 100.00',
  16. 'imageUrl':
  17. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  18. },
  19. {
  20. 'titulo': 'Hamburguesa de res',
  21. 'descripcion': 'Hamburguesa de res con queso cheddar',
  22. 'precio': '\$ 120.00',
  23. 'imageUrl':
  24. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  25. },
  26. {
  27. 'titulo': 'Hamburguesa de pollo',
  28. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  29. 'precio': '\$ 100.00',
  30. 'imageUrl':
  31. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  32. },
  33. {
  34. 'titulo': 'Hamburguesa de pollo',
  35. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  36. 'precio': '\$ 100.00',
  37. 'imageUrl':
  38. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  39. },
  40. {
  41. 'titulo': 'Hamburguesa de pollo',
  42. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  43. 'precio': '\$ 100.00',
  44. 'imageUrl':
  45. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  46. },
  47. {
  48. 'titulo': 'Hamburguesa de pollo',
  49. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  50. 'precio': '\$ 100.00',
  51. 'imageUrl':
  52. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  53. },
  54. {
  55. 'titulo': 'Hamburguesa de pollo',
  56. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  57. 'precio': '\$ 100.00',
  58. 'imageUrl':
  59. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  60. },
  61. {
  62. 'titulo': 'Hamburguesa de pollo',
  63. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  64. 'precio': '\$ 100.00',
  65. 'imageUrl':
  66. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  67. },
  68. {
  69. 'titulo': 'Hamburguesa de pollo',
  70. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  71. 'precio': '\$ 100.00',
  72. 'imageUrl':
  73. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  74. },
  75. {
  76. 'titulo': 'Hamburguesa de pollo',
  77. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  78. 'precio': '\$ 100.00',
  79. 'imageUrl':
  80. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  81. },
  82. {
  83. 'titulo': 'Hamburguesa de pollo',
  84. 'descripcion': 'Hamburguesa de pollo con queso cheddar',
  85. 'precio': '\$ 100.00',
  86. 'imageUrl':
  87. 'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
  88. },
  89. ];
  90. class HomeScreen extends StatefulWidget {
  91. const HomeScreen({Key? key}) : super(key: key);
  92. @override
  93. State<HomeScreen> createState() => _HomeScreenState();
  94. }
  95. class _HomeScreenState extends State<HomeScreen> {
  96. @override
  97. void initState() {
  98. super.initState();
  99. }
  100. handleTap() {
  101. print('Tapped');
  102. }
  103. @override
  104. Widget build(BuildContext context) {
  105. return Scaffold(
  106. backgroundColor: Colors.white,
  107. body: CustomScrollView(
  108. slivers: [
  109. SliverToBoxAdapter(
  110. child: Container(),
  111. ),
  112. SliverAppBar(
  113. floating: true,
  114. expandedHeight: 200, // Ajusta la altura para acomodar la imagen
  115. flexibleSpace: FlexibleSpaceBar(
  116. background: Image.asset(
  117. 'assets/Turquessa.png',
  118. fit: BoxFit.cover,
  119. ),
  120. ),
  121. bottom: PreferredSize(
  122. preferredSize:
  123. Size.fromHeight(120), // Altura del contenido adicional
  124. child: Container(
  125. color: Color.fromARGB(255, 47, 208, 229),
  126. padding:
  127. const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
  128. child: Row(
  129. children: [
  130. Container(
  131. width: 80,
  132. height: 80,
  133. decoration: BoxDecoration(
  134. color: Colors.white,
  135. borderRadius: BorderRadius.circular(12),
  136. ),
  137. child: Center(
  138. child: Image.asset('assets/Turquessa.png'),
  139. ),
  140. ),
  141. const SizedBox(width: 20),
  142. const Text(
  143. 'Turquessa',
  144. style: TextStyle(
  145. color: Colors.black,
  146. fontSize: 26,
  147. fontWeight: FontWeight.bold,
  148. ),
  149. ),
  150. const SizedBox(width: 15),
  151. Container(
  152. padding: const EdgeInsets.all(8),
  153. decoration: BoxDecoration(
  154. shape: BoxShape.circle,
  155. border: Border.all(color: Colors.white, width: 2),
  156. ),
  157. child: const Icon(Icons.info,
  158. color: Colors.white, size: 20),
  159. ),
  160. ],
  161. ),
  162. ),
  163. ),
  164. ),
  165. SliverPersistentHeader(
  166. delegate: CategoriasSliverChild(),
  167. pinned: true,
  168. ),
  169. SliverList(
  170. delegate: SliverChildBuilderDelegate(
  171. (context, index) {
  172. if (index < items.length) {
  173. return Column(
  174. children: [
  175. _buildBurgerItem(
  176. items[index]['titulo'],
  177. items[index]['descripcion'],
  178. items[index]['precio'],
  179. items[index]['imageUrl']),
  180. const Divider(
  181. color: Colors.black,
  182. height: 2,
  183. )
  184. ],
  185. );
  186. } else {
  187. return _buildBurgerItem(
  188. items[index]['titulo'],
  189. items[index]['descripcion'],
  190. items[index]['precio'],
  191. items[index]['imageUrl']);
  192. }
  193. },
  194. childCount: items.length,
  195. ))
  196. ],
  197. ));
  198. }
  199. }
  200. class CategoriasSliverChild extends SliverPersistentHeaderDelegate {
  201. @override
  202. Widget build(
  203. BuildContext context, double shrinkOffset, bool overlapsContent) {
  204. return SingleChildScrollView(
  205. scrollDirection: Axis.horizontal, child: CategoriasNavBar());
  206. }
  207. @override
  208. double get maxExtent => 120.0;
  209. @override
  210. double get minExtent => 120.0;
  211. @override
  212. bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
  213. return false;
  214. }
  215. }
  216. Widget _buildBurgerItem(
  217. String titulo, String descripcion, String precio, String imageUrl) {
  218. return Padding(
  219. padding: const EdgeInsets.symmetric(vertical: 20),
  220. child: Row(
  221. crossAxisAlignment: CrossAxisAlignment.start,
  222. children: [
  223. const SizedBox(width: 20),
  224. ClipRRect(
  225. borderRadius: BorderRadius.circular(8),
  226. child: Image.network(
  227. imageUrl,
  228. width: 120,
  229. height: 120,
  230. fit: BoxFit.cover,
  231. ),
  232. ),
  233. const SizedBox(width: 20),
  234. Expanded(
  235. child: Column(
  236. crossAxisAlignment: CrossAxisAlignment.start,
  237. children: [
  238. Text(
  239. titulo,
  240. style: const TextStyle(
  241. color: Colors.black,
  242. fontSize: 22,
  243. fontWeight: FontWeight.bold,
  244. ),
  245. ),
  246. const SizedBox(height: 10),
  247. Text(
  248. descripcion,
  249. style: const TextStyle(
  250. color: Colors.grey,
  251. fontSize: 16,
  252. ),
  253. ),
  254. const SizedBox(height: 20),
  255. Text(
  256. precio,
  257. style: const TextStyle(
  258. color: Colors.black,
  259. fontSize: 24,
  260. fontWeight: FontWeight.bold,
  261. ),
  262. ),
  263. ],
  264. ),
  265. ),
  266. const SizedBox(width: 20),
  267. ],
  268. ),
  269. );
  270. }