Mobiles_programming/lib/main.dart

202 lines
5.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@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<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 'Хоррор';
}
}
}