Compare commits

...

3 Commits

Author SHA1 Message Date
93b613b285 Сдал лаб 3 2024-10-13 20:04:40 +04:00
600bf3b2cd Merge remote-tracking branch 'origin/lab_2' into lab_3 2024-10-03 14:10:57 +04:00
e5b3c53355 подправил лаб 2 2024-10-03 14:09:43 +04:00

View File

@ -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<MyHomePage> {
@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<void> 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<GameType, String> GameTypeNames = {
GameType.FMV: "FMV",
GameType.Shooter: "Шутер",
GameType.Strategy: "Стратегия",
GameType.Horror: "Хоррор"
};
void availableTypesRus() => printMapValues(GameTypeNames);
//цикл (loop) + generic (хз, куда ещё их можно)
void printMapValues<T, U>(Map<T, U> 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<void> 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<GameType, String> GameTypeNames = {
// GameType.FMV: "FMV",
// GameType.Shooter: "Шутер",
// GameType.Strategy: "Стратегия",
// GameType.Horror: "Хоррор"
// };
//
// void availableTypesRus() => printMapValues(GameTypeNames);
//
// //цикл (loop) + generic (хз, куда ещё их можно)
// void printMapValues<T, U>(Map<T, U> 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 'Хоррор';
// }
// }
// }