import 'package:flutter/material.dart'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( // This is the theme of your application. // // TRY THIS: Try running your application with "flutter run". You'll see // the application has a purple toolbar. Then, without quitting the app, // try changing the seedColor in the colorScheme below to Colors.green // and then invoke "hot reload" (save your changes or press the "hot // reload" button in a Flutter-supported IDE, or press "r" if you used // the command line to start the app). // // Notice that the counter didn't reset back to zero; the application // state is not lost during the reload. To reset the state, use hot // restart instead. // // This works for code too, not just values: Most code changes can be // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(title: 'Разубаев Сергей Михайлович'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); // This widget is the home page of your application. It is stateful, meaning // that it has a State object (defined below) that contains fields that affect // how it looks. // This class is the configuration for the state. It holds the values (in this // case the title) provided by the parent (in this case the App widget) and // used by the build method of the State. Fields in a Widget subclass are // always marked "final". final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { final Color _color = Colors.blueAccent; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: const MyWidget(), ); } } class MyWidget extends StatelessWidget { const MyWidget({super.key}); @override Widget build(BuildContext context) { final data = [ _CardData( 'Зов Ктулху', descriptionText: 'Лучше бы не находить разгадку, объединяющую сошедших с ума творцов...', imageUrl: 'https://lovecraft.country/images/bibliography/call-of-cthulhu-mini.webp' ), _CardData( 'Хребты безумия', descriptionText: '«Хребты безумия» написаны в документальной манере повествования, постепенно привыкая к которой, становишься свидетелем особой реальности описываемых событий.', icon: Icons.hail, imageUrl: 'https://lovecraft.country/images/bibliography/At-the-Mountains-of-Madness-mini.webp' ), _CardData('Тень над Инсмутом', descriptionText: 'Инсмут, маленький рыбацкий городок неподалеку от Аркхэма, уже много лет имеет дурную славу. В округе ходят жуткие истории о его угрюмых и уродливых жителях, от которых лучше держаться подальше.', icon: Icons.warning_amber, imageUrl: 'https://lovecraft.country/images/bibliography/The-Shadow-over-Innsmouth.webp') ]; return Center( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: data.map((e) => _Card.fromData(e)).toList(), ), ), ); } } 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 _Card extends StatelessWidget { final String text; final String descriptionText; final IconData icon; final String? imageUrl; const _Card(this.text, {required this.descriptionText, this.icon = Icons.ac_unit_outlined, this.imageUrl}); factory _Card.fromData(_CardData data) => _Card( data.text, descriptionText: data.descriptionText, icon: data.icon, imageUrl: data.imageUrl, ); @override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.only(top: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.amber, borderRadius: BorderRadius.circular(20), border: Border.all( color: Colors.grey, width: 2, ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(20), child: SizedBox( width: 140, height: 100, child: Image.network( imageUrl ?? '', fit: BoxFit.cover, errorBuilder: (_, __, ___) => const Placeholder(), ), ), ), Flexible( child: Padding( padding: const EdgeInsets.only(left: 16.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.only(left:8.0), child: Icon(icon), ), ], ), ); } }