import 'package:flutter/material.dart'; import 'dart:math'; 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.cyan), 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( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: const GameWidget(), ); } } class GameWidget extends StatelessWidget { const GameWidget({super.key}); @override Widget build(BuildContext context) { return Center( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ _GameCard(name: 'Late Shift', price: 399,), ], ) ) ); } } class _GameCard extends StatelessWidget { final String name; final int price; // final GameType type; // final String? description; //для image можно задать default значение (через = в констркуторе) // final String image; const _GameCard({ super.key, required this.name, required this.price, }); // const _GameCard({ // super.key, required this.name, required this.price, required this.type, this.description, required this.image, // }); @override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.only(top: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.lightBlue, borderRadius: BorderRadius.circular(5), ), child: //ПЫТАЕТСЯ РАСТЯНУТЬСЯ НА ВЕСЬ ЭКРАН, ИСПРАВИТЬ Row( children: [ //ЗДЕСЬ ДО СТОЛБЦА БУДЕТ ФОТО (ОНО ДОЛЖНО БЫТЬ СЛЕВА) Column( children: [ //название игры Text( name, style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, ), ), //цена игры Text( price.toString()+' руб.', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, ), ), ], ), ], )); } } class Game extends Object { final String name; final int price; final GameType type; //жанр игры final String? description; @override bool operator ==(Object other) { if (other is Game) { return this.name == other.name; } return false; } //стандартный конструктор с именованными параметрами Game( {required this.name, required this.price, required this.type, this.description}); //именованный конструктор с примером игры Game.exampleLateShift() : name = 'Late Shift', price = 200, type = GameType.FMV, description = null; void printInfo() { print(''' Игра: $name Жанр: ${GameTypeNames[type]} Цена: $price руб. '''); if (description != null) { print('Описание: $description'); } } //асинхронный метод - иммитация скачивания Future download() async { print('Начало загрузки игры $name'); var rand = Random(); int time = rand.nextInt(10000) + 100; //асинхронность (Future), анонимная функция (Anonymous function) Future.delayed( Duration(milliseconds: time), () => print("Игра $name загружена")); } } enum GameType { FMV, Shooter, Strategy, Horror } //Названия жанров на русском const Map GameTypeNames = { GameType.FMV: "FMV", GameType.Shooter: "Шутер", GameType.Strategy: "Стратегия", GameType.Horror: "Хоррор" }; void availableTypesRus() => printMapValues(GameTypeNames); //цикл (loop) + generic (хз, куда ещё их можно) void printMapValues(Map map) { for (var val in map.values) { print(val); } } extension GameTypeRus on GameType { String get rusName { switch (this) { case GameType.FMV: return 'FMV'; case GameType.Shooter: return 'Шутер'; case GameType.Strategy: return 'Стратегия'; case GameType.Horror: return 'Хоррор'; } } }