2024-10-22 00:36:13 +04:00
|
|
|
|
import 'dart:math';
|
2024-10-21 16:34:25 +04:00
|
|
|
|
import 'package:flutter/material.dart';
|
2024-10-22 00:36:13 +04:00
|
|
|
|
// Classes +
|
|
|
|
|
// Methods +
|
|
|
|
|
// Enums +
|
|
|
|
|
// Loops +
|
|
|
|
|
// Generics (List<>) +
|
|
|
|
|
// Anonymous functions +
|
|
|
|
|
// Future +
|
|
|
|
|
// Extension +
|
2024-10-21 16:34:25 +04:00
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
runApp(const MyApp());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class MyApp extends StatelessWidget {
|
|
|
|
|
const MyApp({super.key});
|
|
|
|
|
|
2024-10-22 00:36:13 +04:00
|
|
|
|
@override
|
2024-10-21 16:34:25 +04:00
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return MaterialApp(
|
2024-10-22 00:36:13 +04:00
|
|
|
|
title: 'Gerimovich demo',
|
2024-10-21 16:34:25 +04:00
|
|
|
|
theme: ThemeData(
|
2024-10-22 00:36:13 +04:00
|
|
|
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.red),
|
2024-10-21 16:34:25 +04:00
|
|
|
|
useMaterial3: true,
|
|
|
|
|
),
|
2024-10-22 00:36:13 +04:00
|
|
|
|
home: const MyHomePage(title: 'Gerimovich I M'),
|
2024-10-21 16:34:25 +04:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class MyHomePage extends StatefulWidget {
|
|
|
|
|
const MyHomePage({super.key, required this.title});
|
|
|
|
|
final String title;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
State<MyHomePage> createState() => _MyHomePageState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class _MyHomePageState extends State<MyHomePage> {
|
2024-10-22 00:36:13 +04:00
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
2024-10-21 16:34:25 +04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
2024-10-22 00:36:13 +04:00
|
|
|
|
return Scaffold(
|
2024-10-21 16:34:25 +04:00
|
|
|
|
appBar: AppBar(
|
2024-10-22 00:36:13 +04:00
|
|
|
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
|
|
|
|
title: Text(widget.title),
|
|
|
|
|
),
|
|
|
|
|
body: const StocksWidget(),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum StockCategory { oilgas, finance, mining }
|
|
|
|
|
extension StockCategoryExtension on StockCategory {
|
|
|
|
|
String get name {
|
|
|
|
|
switch (this) {
|
|
|
|
|
case StockCategory.oilgas:
|
|
|
|
|
return 'Нефтегазовая отрасль';
|
|
|
|
|
case StockCategory.finance:
|
|
|
|
|
return 'Банки';
|
|
|
|
|
case StockCategory.mining:
|
|
|
|
|
return 'Добыча полезных ископаемых';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Stock {
|
|
|
|
|
final String name;
|
|
|
|
|
final double price;
|
|
|
|
|
final String imageUrl;
|
|
|
|
|
final StockCategory category;
|
|
|
|
|
|
|
|
|
|
Stock({
|
|
|
|
|
required this.name,
|
|
|
|
|
required this.price,
|
|
|
|
|
required this.imageUrl,
|
|
|
|
|
required this.category,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class StocksWidget extends StatelessWidget {
|
|
|
|
|
const StocksWidget({super.key});
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
|
|
|
|
|
final stocks = [
|
|
|
|
|
Stock(
|
|
|
|
|
name: 'Алроса',
|
|
|
|
|
price: 52.90,
|
|
|
|
|
imageUrl:
|
|
|
|
|
'https://data.cbonds.info/organisations_logos/18/1617957662ALROSA_Rus_COLOUR_RGB.jpg',
|
|
|
|
|
category: StockCategory.mining),
|
|
|
|
|
Stock(
|
|
|
|
|
name: 'Газпром',
|
|
|
|
|
price: 135.43,
|
|
|
|
|
imageUrl: 'https://data.cbonds.info/organisations_logos/21/21.png',
|
|
|
|
|
category: StockCategory.oilgas),
|
|
|
|
|
Stock(
|
|
|
|
|
name: 'Сбербанк',
|
|
|
|
|
price: 257.50,
|
|
|
|
|
imageUrl:
|
|
|
|
|
'https://data.cbonds.info/organisations_logos/313/1615279834sberbank__2-01.png',
|
|
|
|
|
category: StockCategory.finance),
|
|
|
|
|
Stock(
|
|
|
|
|
name: 'Сбербанк',
|
|
|
|
|
price: 111111111.111111111,
|
|
|
|
|
imageUrl:
|
|
|
|
|
'https://data.cbonds.info/organisations_logos/313/1615279834sberbank__2-01.png',
|
|
|
|
|
category: StockCategory.finance),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return Center(
|
|
|
|
|
child: SingleChildScrollView(
|
|
|
|
|
child: Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
...stocks.map((e) => StockCard(stock: e)),
|
|
|
|
|
],
|
|
|
|
|
),
|
2024-10-21 16:34:25 +04:00
|
|
|
|
),
|
2024-10-22 00:36:13 +04:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class StockCard extends StatelessWidget {
|
|
|
|
|
final Stock stock;
|
|
|
|
|
const StockCard({super.key, required this.stock});
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Card(
|
|
|
|
|
margin: const EdgeInsets.all(8.0),
|
|
|
|
|
child: Padding(
|
|
|
|
|
padding: const EdgeInsets.all(14.0),
|
|
|
|
|
child: Row(
|
|
|
|
|
children: [
|
|
|
|
|
Image.network(
|
|
|
|
|
stock.imageUrl,
|
|
|
|
|
width: 85,
|
|
|
|
|
height: 85,
|
2024-10-21 16:34:25 +04:00
|
|
|
|
),
|
2024-10-22 00:36:13 +04:00
|
|
|
|
const SizedBox(width: 16.0),
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
stock.name,
|
|
|
|
|
style: Theme.of(context).textTheme.headlineSmall,
|
|
|
|
|
),
|
|
|
|
|
Text(
|
|
|
|
|
'${stock.price.toStringAsFixed(2)} р',
|
|
|
|
|
style: Theme.of(context).textTheme.bodyLarge,
|
|
|
|
|
),
|
|
|
|
|
Text(
|
|
|
|
|
stock.category.name,
|
|
|
|
|
style: Theme.of(context).textTheme.bodySmall,
|
|
|
|
|
),
|
|
|
|
|
],
|
2024-10-21 16:34:25 +04:00
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
2024-10-22 00:36:13 +04:00
|
|
|
|
);
|
2024-10-21 16:34:25 +04:00
|
|
|
|
}
|
|
|
|
|
}
|