first 3 labs done

This commit is contained in:
platoff84hz 2024-10-22 13:59:52 +04:00
parent bf3a31379d
commit c7a1d1bead
4 changed files with 101 additions and 51 deletions

19
lib/StockCategory.dart Normal file
View File

@ -0,0 +1,19 @@
enum StockCategory {
oilgas,
mining,
finance
}
extension StockCategoryExtension on StockCategory {
String get name {
switch (this) {
case StockCategory.oilgas:
return 'Нефтегазовая отрасль';
case StockCategory.mining:
return 'Добыча полезных ископаемых';
case StockCategory.finance:
return 'Банки';
}
}
}

View File

@ -1,13 +1,6 @@
import 'dart:math';
import 'package:flutter/material.dart';
// Classes +
// Methods +
// Enums +
// Loops +
// Generics (List<>) +
// Anonymous functions +
// Future +
// Extension +
import 'package:fl_chart/fl_chart.dart';
import 'StockCategory.dart';
void main() {
runApp(const MyApp());
@ -24,13 +17,14 @@ class MyApp extends StatelessWidget {
colorScheme: ColorScheme.fromSeed(seedColor: Colors.red),
useMaterial3: true,
),
home: const MyHomePage(title: 'Gerimovich I M'),
home: const MyHomePage(title: 'Gerimovich Ilya Maximovich'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
@ -55,39 +49,39 @@ class _MyHomePageState extends State<MyHomePage> {
}
}
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;
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,
this.name, this.price, this.imageUrl, this.category,
});
}
class StocksWidget extends StatelessWidget {
class StocksWidget extends StatefulWidget {
const StocksWidget({super.key});
@override
State<StocksWidget> createState() => _StocksWidgetState();
}
class _StocksWidgetState extends State<StocksWidget> {
final List<double> prices = [52.90, 77, 89, 111, 135.43, 157.50, 111.11];
Future<void> _fetchNewPrice() async {
await Future.delayed(const Duration(seconds: 1));
setState(() {
prices.add(prices.last + (prices.last * 0.1));
//if (prices.length > 5) {
// prices.removeAt(0);
//}
});
}
@override
Widget build(BuildContext context) {
final stocks = [
Stock(
name: 'Алроса',
@ -97,21 +91,15 @@ class StocksWidget extends StatelessWidget {
category: StockCategory.mining),
Stock(
name: 'Газпром',
price: 135.43,
price: 135.431111,
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),
Stock(),
];
return Center(
@ -120,6 +108,32 @@ class StocksWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: [
...stocks.map((e) => StockCard(stock: e)),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _fetchNewPrice,
child: const Text('Добавить новую цену'),
),
const SizedBox(height: 20),
SizedBox(
height: 300,
child: LineChart(
LineChartData(
lineBarsData: [
LineChartBarData(
spots: prices
.asMap()
.map((index, price) => MapEntry(index.toDouble(), FlSpot(index.toDouble(), price)))
.values
.toList(),
isCurved: true,
color: Colors.blue,
barWidth: 3,
dotData: const FlDotData(show: false),
),
],
),
),
),
],
),
),
@ -129,35 +143,36 @@ class StocksWidget extends StatelessWidget {
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),
margin: const EdgeInsets.all(8.5),
child: Padding(
padding: const EdgeInsets.all(14.0),
padding: const EdgeInsets.all(20),
child: Row(
children: [
Image.network(
stock.imageUrl,
stock.imageUrl ?? 'https://img.freepik.com/premium-vector/vector-illustration-about-concept-of-no-result-data-or-document-or-file-not-found_675567-5734.jpg',
width: 85,
height: 85,
),
const SizedBox(width: 16.0),
const SizedBox(width: 20),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
stock.name,
stock.name ?? '',
style: Theme.of(context).textTheme.headlineSmall,
),
Text(
'${stock.price.toStringAsFixed(2)} р',
'${stock.price?.toStringAsFixed(2)} р',
style: Theme.of(context).textTheme.bodyLarge,
),
Text(
stock.category.name,
stock.category?.name ?? '',
style: Theme.of(context).textTheme.bodySmall,
),
],
@ -167,4 +182,4 @@ class StockCard extends StatelessWidget {
),
);
}
}
}

View File

@ -49,6 +49,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.8"
equatable:
dependency: transitive
description:
name: equatable
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
url: "https://pub.dev"
source: hosted
version: "2.0.5"
fake_async:
dependency: transitive
description:
@ -57,6 +65,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
fl_chart:
dependency: "direct main"
description:
name: fl_chart
sha256: "94307bef3a324a0d329d3ab77b2f0c6e5ed739185ffc029ed28c0f9b019ea7ef"
url: "https://pub.dev"
source: hosted
version: "0.69.0"
flutter:
dependency: "direct main"
description: flutter

View File

@ -31,7 +31,7 @@ dependencies:
flutter:
sdk: flutter
fl_chart: ^0.69.0
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8