import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } const Color mainColor = Colors.deepOrangeAccent; class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: mainColor), useMaterial3: true, ), home: const MyHomePage(title: 'Кафе Ящик'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: Icon(Icons.abc_rounded), backgroundColor: mainColor, title: Text(widget.title), ), body: const MyWidget(), ); } } class MyWidget extends StatelessWidget { const MyWidget({super.key}); @override Widget build(BuildContext context) { final data = [ _CardData( 'Рулет из баклажанов', descriprionText: 'рулет из баклажанов, чеснока и сыра', weight: 300, imageUrl: 'https://kolyda.ru/d/baklazhanchiki_farshirovannye_orehami.jpg', ), _CardData( 'Лагман', descriprionText: 'Суп из говядины и овощей', isTop: true, weight: 250, imageUrl: 'https://avatars.mds.yandex.net/get-altay/5257938/2' 'a0000018aa4c0859fe7c036bfa6312e4732/XXL_height', ), _CardData( 'Манты', descriprionText: 'Это пельмени. Большие.', weight: 250, imageUrl: 'https://chaihana-zamzam.ru/wp-content/uploads/2022/10/Mantu.jpg', ), _CardData( 'Свиной шашлык', descriprionText: 'Осторожно ! Свинина !', isTop: true, weight: 300, imageUrl: 'https://avatars.mds.yandex.net/get-altay/9686455/2a0000018a4892e137bca9e41256a79d2c7a/orig', icon: Icons.warning, ), _CardData( 'Куриный шашлык', descriprionText: 'Халяль', weight: 300, imageUrl: 'https://i.pinimg.com/originals/2f/b5/7e/2fb57efeac571775d423ad995e5c1e1d.jpg', ), ]; return Center( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: data.map((e) => _Card.fromData(e)).toList(), ), ), ); } } class _CardData { final String text; final String descriprionText; final int weight; final IconData icon; final String? imageUrl; final bool isTop; _CardData( this.text, { required this.descriprionText, required this.weight, this.icon = Icons.hail, this.imageUrl, this.isTop = false, }); } class _Card extends StatelessWidget { final String text; final IconData icon; final String descriptionText; final String? imageUrl; final Color color; const _Card( this.text, { this.icon = Icons.ac_unit_outlined, required this.descriptionText, this.imageUrl, this.color = Colors.white70, }); factory _Card.fromData(_CardData data) => _Card( data.text, descriptionText: data.descriprionText, icon: data.icon, imageUrl: data.imageUrl, color: (data.isTop ? mainColor : Colors.white70), ); @override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.only(top: 8, bottom: 8), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: color, borderRadius: BorderRadius.circular(20), border: Border.all( color: Colors.black, width: 3, ), boxShadow: [ BoxShadow(color: Colors.grey, spreadRadius: 4, blurRadius: 8) ]), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ ClipRRect( borderRadius: BorderRadius.circular(20), child: SizedBox( height: 140, width: 120, child: Image.network( fit: BoxFit.cover, imageUrl ?? '', errorBuilder: (_, __, ___) => const Placeholder(), ), ), ), Expanded( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( text, style: Theme.of(context).textTheme.headlineLarge, ), Text( descriptionText, style: Theme.of(context).textTheme.bodyLarge, ), ], ), ), ), Padding( padding: const EdgeInsets.all(8.0), child: Icon(icon), ), ], ), ); } }