From 93b613b2856e67d0e88c5db807c932ad7e13584d Mon Sep 17 00:00:00 2001 From: ujijrujijr Date: Sun, 13 Oct 2024 20:04:40 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B0=D0=BB=20=D0=BB=D0=B0=D0=B1?= =?UTF-8?q?=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 312 ++++++++++++++++++++++++++++---------------------- 1 file changed, 176 insertions(+), 136 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 42f87bb..b41c1ad 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'dart:math'; void main() { runApp(const MyApp()); @@ -13,10 +12,6 @@ class MyApp extends StatelessWidget { return MaterialApp( title: 'Flutter Demo', debugShowCheckedModeBanner: false, - theme: ThemeData( - colorScheme: ColorScheme.fromSeed(seedColor: Colors.cyan), - useMaterial3: true, - ), home: const MyHomePage(title: 'Чернышев Георгий Янович'), ); } @@ -35,11 +30,20 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Color.fromARGB(255, 46, 65, 80), appBar: AppBar( - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - title: Text(widget.title), + backgroundColor: Color.fromARGB(255, 56, 90, 128), + title: Text( + widget.title, + style: + const TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + ), + body: Container( + //симметричный боковой отступ от границ экрана + margin: const EdgeInsets.symmetric(horizontal: 15.0), + child: const GameWidget(), ), - body: const GameWidget(), ); } } @@ -49,153 +53,189 @@ class GameWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final data=[ + _GameData( + name: 'Late Shift', + price: 399, + image: + 'https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/584980/capsule_616x353.jpg?t=1697110140'), + _GameData( + name: 'Dark Nights with Poe & Munro', + price: 450, + image: + 'https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1098170/capsule_616x353.jpg?t=1725541685'), + _GameData( + name: 'Неизвестная игра', + price: 999, + ) + ]; return Center( child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _GameCard(name: 'Late Shift', price: 399,), - ], - ) - ) + child: Column( + children: data.map((e) => _GameCard.fromData(e)).toList()) + ) ); } } +class _GameData { + final String name; + final int price; + final String? image; + + _GameData({ + required this.name, + required this.price, + this.image='https://parpol.ru/wp-content/uploads/2019/09/placeholder.png'}); +} + class _GameCard extends StatelessWidget { final String name; final int price; - // final GameType type; - // final String? description; - //для image можно задать default значение (через = в констркуторе) - // final String image; + final String? image; + //обычный конструктор const _GameCard({ - super.key, required this.name, required this.price, + super.key, + required this.name, + required this.price, + this.image, }); - // const _GameCard({ - // super.key, required this.name, required this.price, required this.type, this.description, required this.image, - // }); + //именованный конструктор + factory _GameCard.fromData(_GameData data) => _GameCard( + name: data.name, + price: data.price, + image: data.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, - ), + margin: const EdgeInsets.only(top: 10, bottom: 10), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color.fromARGB(255, 56, 90, 128), + borderRadius: BorderRadius.circular(5), + ), + child: + Column( + //Выравнивание по середине + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 200, + width: MediaQuery.of(context).size.width, + child: Image.network(image ?? '', + fit: BoxFit.fill, + errorBuilder: (_, __, ___) => const Placeholder()), + ), + // Название игры + Text( + name, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 32, ), - //цена игры - Text( - price.toString()+' руб.', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), + textAlign: TextAlign.center, + // softWrap: true, + ), + // Цена игры + Text( + '$price руб.', + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 24, ), - ], - ), - ], - )); + //softWrap: true, + ), + ], + ) + ); } } -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) - await 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 'Хоррор'; - } - } -} +// 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) +// await 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 'Хоррор'; +// } +// } +// }