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 'package:flutter/material.dart';
import 'dart:math';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
@ -13,10 +12,6 @@ class MyApp extends StatelessWidget {
return MaterialApp( return MaterialApp(
title: 'Flutter Demo', title: 'Flutter Demo',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.cyan),
useMaterial3: true,
),
home: const MyHomePage(title: 'Чернышев Георгий Янович'), home: const MyHomePage(title: 'Чернышев Георгий Янович'),
); );
} }
@ -35,11 +30,20 @@ class _MyHomePageState extends State<MyHomePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: Color.fromARGB(255, 46, 65, 80),
appBar: AppBar( appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary, backgroundColor: Color.fromARGB(255, 56, 90, 128),
title: Text(widget.title), 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 @override
Widget build(BuildContext context) { 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( return Center(
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, children: data.map((e) => _GameCard.fromData(e)).toList())
children: [ )
_GameCard(name: 'Late Shift', price: 399,),
],
)
)
); );
} }
} }
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 { class _GameCard extends StatelessWidget {
final String name; final String name;
final int price; final int price;
// final GameType type; final String? image;
// final String? description;
//для image можно задать default значение (через = в констркуторе)
// final String image;
//обычный конструктор
const _GameCard({ 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.only(top: 16), margin: const EdgeInsets.only(top: 10, bottom: 10),
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.lightBlue, color: const Color.fromARGB(255, 56, 90, 128),
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
), ),
child: child:
//ПЫТАЕТСЯ РАСТЯНУТЬСЯ НА ВЕСЬ ЭКРАН, ИСПРАВИТЬ Column(
Row( //Выравнивание по середине
children: [ crossAxisAlignment: CrossAxisAlignment.center,
//ЗДЕСЬ ДО СТОЛБЦА БУДЕТ ФОТО (ОНО ДОЛЖНО БЫТЬ СЛЕВА) children: [
Column( SizedBox(
children: [ height: 200,
//название игры width: MediaQuery.of(context).size.width,
Text( child: Image.network(image ?? '',
name, fit: BoxFit.fill,
style: TextStyle( errorBuilder: (_, __, ___) => const Placeholder()),
color: Colors.white, ),
fontWeight: FontWeight.bold, // Название игры
), Text(
name,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 32,
), ),
//цена игры textAlign: TextAlign.center,
Text( // softWrap: true,
price.toString()+' руб.', ),
style: TextStyle( // Цена игры
color: Colors.white, Text(
fontWeight: FontWeight.bold, '$price руб.',
), style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 24,
), ),
], //softWrap: true,
), ),
], ],
)); )
);
} }
} }
class Game extends Object { // class Game extends Object {
final String name; // final String name;
final int price; // final int price;
final GameType type; //жанр игры // final GameType type; //жанр игры
final String? description; // final String? description;
//
@override // @override
bool operator ==(Object other) { // bool operator ==(Object other) {
if (other is Game) { // if (other is Game) {
return this.name == other.name; // return this.name == other.name;
} // }
return false; // return false;
} // }
//
//стандартный конструктор с именованными параметрами // //стандартный конструктор с именованными параметрами
Game( // Game(
{required this.name, // {required this.name,
required this.price, // required this.price,
required this.type, // required this.type,
this.description}); // this.description});
//
//именованный конструктор с примером игры // //именованный конструктор с примером игры
Game.exampleLateShift() // Game.exampleLateShift()
: name = 'Late Shift', // : name = 'Late Shift',
price = 200, // price = 200,
type = GameType.FMV, // type = GameType.FMV,
description = null; // description = null;
//
void printInfo() { // void printInfo() {
print(''' // print('''
Игра: $name // Игра: $name
Жанр: ${GameTypeNames[type]} // Жанр: ${GameTypeNames[type]}
Цена: $price руб. '''); // Цена: $price руб. ''');
if (description != null) { // if (description != null) {
print('Описание: $description'); // print('Описание: $description');
} // }
} // }
//
//асинхронный метод - иммитация скачивания // //асинхронный метод - иммитация скачивания
Future<void> download() async { // Future<void> download() async {
print('Начало загрузки игры $name'); // print('Начало загрузки игры $name');
var rand = Random(); // var rand = Random();
int time = rand.nextInt(10000) + 100; // int time = rand.nextInt(10000) + 100;
//асинхронность (Future), анонимная функция (Anonymous function) // //асинхронность (Future), анонимная функция (Anonymous function)
Future.delayed( // await Future.delayed(
Duration(milliseconds: time), () => print("Игра $name загружена")); // Duration(milliseconds: time), () => print("Игра $name загружена"));
} // }
} // }
//
enum GameType { FMV, Shooter, Strategy, Horror } // enum GameType { FMV, Shooter, Strategy, Horror }
//
//Названия жанров на русском // //Названия жанров на русском
const Map<GameType, String> GameTypeNames = { // const Map<GameType, String> GameTypeNames = {
GameType.FMV: "FMV", // GameType.FMV: "FMV",
GameType.Shooter: "Шутер", // GameType.Shooter: "Шутер",
GameType.Strategy: "Стратегия", // GameType.Strategy: "Стратегия",
GameType.Horror: "Хоррор" // GameType.Horror: "Хоррор"
}; // };
//
void availableTypesRus() => printMapValues(GameTypeNames); // void availableTypesRus() => printMapValues(GameTypeNames);
//
//цикл (loop) + generic (хз, куда ещё их можно) // //цикл (loop) + generic (хз, куда ещё их можно)
void printMapValues<T, U>(Map<T, U> map) { // void printMapValues<T, U>(Map<T, U> map) {
for (var val in map.values) { // for (var val in map.values) {
print(val); // print(val);
} // }
} // }
//
extension GameTypeRus on GameType { // extension GameTypeRus on GameType {
String get rusName { // String get rusName {
switch (this) { // switch (this) {
case GameType.FMV: // case GameType.FMV:
return 'FMV'; // return 'FMV';
case GameType.Shooter: // case GameType.Shooter:
return 'Шутер'; // return 'Шутер';
case GameType.Strategy: // case GameType.Strategy:
return 'Стратегия'; // return 'Стратегия';
case GameType.Horror: // case GameType.Horror:
return 'Хоррор'; // return 'Хоррор';
} // }
} // }
} // }