import 'dart:math'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange), 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 { final Color _color = Colors.orangeAccent; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: _color, title: Text(widget.title), ), body: const MyWidget(), ); } } class _CardData { final String text; final String descriptionText; final IconData icon; final String? imageUrl; _CardData( this.text, { required this.descriptionText, this.icon = Icons.ac_unit_outlined, this.imageUrl, }); } class MyWidget extends StatelessWidget { const MyWidget({super.key}); // ключи @override Widget build(BuildContext context) { final data = [ _CardData( 'Hello', descriptionText: 'hshhshs', imageUrl: 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg' ), // создаётся объект ранее созданного контейнера _CardData( 'Ivan', descriptionText: 'hshhshs', imageUrl: 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg' ), _CardData( 'Stepan', descriptionText: 'hshhshs', imageUrl: 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg' ), ]; return Center( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, //расположение по главной оси children: data.map((e) => _Card.fromData(e)).toList(), ), ), ); } } class _Card extends StatefulWidget { final String text; final String descriptionText; final IconData icon; final String? imageUrl; const _Card( this.text, { this.icon = Icons.ac_unit_outlined, required this.descriptionText, this.imageUrl, } ); factory _Card.fromData(_CardData data) => _Card( data.text, descriptionText: data.descriptionText, icon: data.icon, imageUrl: data.imageUrl, ); @override State<_Card> createState() => _CardState(); } class _CardState extends State<_Card> { @override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.only(top: 15), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.orangeAccent, borderRadius: BorderRadius.circular(20), border: Border.all( color: Colors.grey, width: 2, ) ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ Flexible( child: ClipRRect( borderRadius: BorderRadius.circular(20), child: SizedBox( height: 140, width: 100, child: Image.network( widget.imageUrl ?? '', fit: BoxFit.cover, errorBuilder: (_, __, ___) => const Placeholder(), ), ), )), Flexible( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.text, style:Theme.of(context).textTheme.headlineLarge, ), Text( widget.descriptionText, style:Theme.of(context).textTheme.bodyLarge, ), ], ), ), ), const Spacer(), Padding( padding: const EdgeInsets.only(left: 8.0), child: Icon(widget.icon), ), ], ), ); } }