415 lines
9.4 KiB
Dart
415 lines
9.4 KiB
Dart
|
// Импорт стороннего компонента
|
|||
|
|
|||
|
|
|||
|
// Функция
|
|||
|
void variablesAndDatatypes() {
|
|||
|
// Переменные и типы данных
|
|||
|
// Логическая переменная: истина (true) или ложь (false)
|
|||
|
bool b = true;
|
|||
|
// Целочисленная переменная
|
|||
|
int i = 10;
|
|||
|
// Вещественная переменная
|
|||
|
double d = 10.001;
|
|||
|
// Текстовая переменная
|
|||
|
String s = 'Hello!';
|
|||
|
|
|||
|
// Коллекции
|
|||
|
// Список (динамический)
|
|||
|
List<int> numbers = [1, 1, 2, 2, 3, 3];
|
|||
|
numbers.add(4);
|
|||
|
print(numbers);
|
|||
|
Set<String> names = {'Ivan', 'Ivan', 'John', 'John', 'Nick', 'Nick'};
|
|||
|
names.add('Helen');
|
|||
|
print(names);
|
|||
|
Map<int, String> dict = {1: 'one', 2: 'two'};
|
|||
|
print(dict);
|
|||
|
dict[0] = 'zero';
|
|||
|
dict[1] = 'one!';
|
|||
|
print(dict);
|
|||
|
}
|
|||
|
|
|||
|
void record() {
|
|||
|
const myRecord = ('text', a: 'one', b: true, c: 3);
|
|||
|
print(myRecord);
|
|||
|
}
|
|||
|
|
|||
|
void variables() {
|
|||
|
// Определение типа переменной при объявлении
|
|||
|
int i = 1;
|
|||
|
// Автоматическое определение типа переменной при объявлении
|
|||
|
var v = 1;
|
|||
|
// Автоматическое определение типа переменной при объявлении
|
|||
|
// с возможностью изменить тип переменной
|
|||
|
dynamic d = 1;
|
|||
|
print(d);
|
|||
|
d = 'test';
|
|||
|
print(d);
|
|||
|
// Все типы данных в Dart являются наследниками класса Object
|
|||
|
Object o = 1;
|
|||
|
}
|
|||
|
|
|||
|
// Функция, которая возвращает значение
|
|||
|
int getValue() {
|
|||
|
return 10;
|
|||
|
}
|
|||
|
|
|||
|
void constants() {
|
|||
|
const int i = 10;
|
|||
|
const j = 10;
|
|||
|
final int k = getValue();
|
|||
|
final l = getValue();
|
|||
|
final int m = 10;
|
|||
|
}
|
|||
|
|
|||
|
void printSmthN(String s) {
|
|||
|
print(s);
|
|||
|
}
|
|||
|
|
|||
|
void printSmth(String? s) {
|
|||
|
// Если s == null, то выводится правая часть выражения
|
|||
|
// иначе будет выводится левая часть выражения
|
|||
|
print(s ?? 'smth');
|
|||
|
}
|
|||
|
|
|||
|
void printSmthUpper(String? s) {
|
|||
|
// Если s == null, то выводится правая часть выражения
|
|||
|
// иначе будет вызвана функция объекта s,
|
|||
|
// а затем будет выводится левая часть выражения
|
|||
|
print(s?.toUpperCase() ?? "SMTH");
|
|||
|
}
|
|||
|
|
|||
|
void printWithError(String? s) {
|
|||
|
print(s!.toUpperCase());
|
|||
|
}
|
|||
|
|
|||
|
void nullables() {
|
|||
|
int a = 10;
|
|||
|
print(a);
|
|||
|
int? b;
|
|||
|
print(b);
|
|||
|
//int c;
|
|||
|
//print(c);
|
|||
|
|
|||
|
String hello = 'Hello!';
|
|||
|
String? nullStr;
|
|||
|
printSmthN(hello);
|
|||
|
// printSmthN(nullStr);
|
|||
|
printSmth(hello);
|
|||
|
printSmth(nullStr);
|
|||
|
printSmthUpper(hello);
|
|||
|
printSmthUpper(nullStr);
|
|||
|
printWithError(hello);
|
|||
|
//printWithError(nullStr);
|
|||
|
}
|
|||
|
|
|||
|
void formattedStrings() {
|
|||
|
const a = 1;
|
|||
|
const b = 2;
|
|||
|
print('a + b');
|
|||
|
// Пример интерполяции
|
|||
|
print('$a + $b');
|
|||
|
// Пример интерполяции
|
|||
|
print('${a + b}');
|
|||
|
|
|||
|
// Пример интерполяции
|
|||
|
const sum = '${a + b}';
|
|||
|
// Пример соединения строк (конкатенация)
|
|||
|
print('sum is ' + sum);
|
|||
|
// Пример интерполяции
|
|||
|
print('sum is $sum');
|
|||
|
}
|
|||
|
|
|||
|
enum GenderType { man, woman, unknown }
|
|||
|
|
|||
|
extension GenderTypeExt on GenderType {
|
|||
|
void printGender() {
|
|||
|
switch (this) {
|
|||
|
case GenderType.man:
|
|||
|
print('This is a man');
|
|||
|
case GenderType.woman:
|
|||
|
print('This is a woman');
|
|||
|
default:
|
|||
|
print('Unknown gender');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void enums() {
|
|||
|
const gender = GenderType.man;
|
|||
|
|
|||
|
print('''
|
|||
|
- This is a woman?
|
|||
|
- ${gender == GenderType.woman}
|
|||
|
''');
|
|||
|
}
|
|||
|
|
|||
|
void conditions() {
|
|||
|
const value = 10;
|
|||
|
|
|||
|
if (value > 100) {
|
|||
|
print('big value');
|
|||
|
} else if (value > 50) {
|
|||
|
print('middle value');
|
|||
|
} else {
|
|||
|
print('small value');
|
|||
|
}
|
|||
|
|
|||
|
// Тернарный оператор
|
|||
|
print(value > 100
|
|||
|
? 'big value'
|
|||
|
: value > 50
|
|||
|
? 'middle value'
|
|||
|
: 'small value');
|
|||
|
|
|||
|
switch (value) {
|
|||
|
case > 100:
|
|||
|
print('big value');
|
|||
|
case > 50:
|
|||
|
print('middle value');
|
|||
|
default:
|
|||
|
print('small value');
|
|||
|
}
|
|||
|
|
|||
|
final valueType = switch (value) {
|
|||
|
> 100 => 'big value',
|
|||
|
> 50 => 'middle value',
|
|||
|
_ => 'small value',
|
|||
|
};
|
|||
|
print(valueType);
|
|||
|
|
|||
|
const gender = GenderType.man;
|
|||
|
switch (gender) {
|
|||
|
case GenderType.man:
|
|||
|
print('This is a man');
|
|||
|
case GenderType.woman:
|
|||
|
print('This is a woman');
|
|||
|
default:
|
|||
|
print('Unknown gender');
|
|||
|
}
|
|||
|
|
|||
|
gender.printGender();
|
|||
|
}
|
|||
|
|
|||
|
// Пример функции
|
|||
|
bool isAMan(GenderType gender) {
|
|||
|
return GenderType.man == gender;
|
|||
|
}
|
|||
|
|
|||
|
// Пример функции в функциональном стиле
|
|||
|
bool isAWoman(GenderType gender) => GenderType.woman == gender;
|
|||
|
|
|||
|
// Пример функции с именованными и неименованными параметрами
|
|||
|
void myPrint(
|
|||
|
String s, {
|
|||
|
bool capitalize = false,
|
|||
|
String? suffix,
|
|||
|
}) {
|
|||
|
print('${capitalize ? s.toUpperCase() : s}${suffix ?? ''}');
|
|||
|
}
|
|||
|
|
|||
|
// Данная функция будет работать с любым списком
|
|||
|
void printList<T>(List<T> list) {
|
|||
|
if (list is List<int> || list is List<String>) {
|
|||
|
print(list);
|
|||
|
} else {
|
|||
|
print('Unknown type ${list.runtimeType}');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Примеры работы с циклами
|
|||
|
void loops() {
|
|||
|
final list = [1, 2, 3, 4];
|
|||
|
|
|||
|
for (int i = 0; i < list.length; i++) {
|
|||
|
print(list[i]);
|
|||
|
}
|
|||
|
|
|||
|
for (final element in list) {
|
|||
|
print(element);
|
|||
|
}
|
|||
|
|
|||
|
int i = 0;
|
|||
|
while (i < list.length) {
|
|||
|
print(list[i]);
|
|||
|
i++;
|
|||
|
}
|
|||
|
|
|||
|
for (final element in list) {
|
|||
|
if (element % 2 == 0) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
print(element);
|
|||
|
}
|
|||
|
|
|||
|
for (final element in list) {
|
|||
|
if (element % 2 != 0) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
print(element);
|
|||
|
}
|
|||
|
|
|||
|
for (final element in list) {
|
|||
|
if (element == 3) {
|
|||
|
break;
|
|||
|
}
|
|||
|
print(element);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Объявление класса
|
|||
|
class Car {
|
|||
|
// Поля
|
|||
|
final int maxSpeed;
|
|||
|
final String? manufacturer;
|
|||
|
|
|||
|
double priceInDollars = 0;
|
|||
|
|
|||
|
// Конструктор
|
|||
|
Car(this.maxSpeed, {this.manufacturer});
|
|||
|
|
|||
|
// Методы
|
|||
|
bool canReachSpeed(int speed) => speed <= maxSpeed;
|
|||
|
|
|||
|
String getInfo() =>
|
|||
|
'car: ${manufacturer ?? 'unknown'}; max speed: $maxSpeed, price \$: ${priceInDollars.toStringAsFixed(2)}';
|
|||
|
|
|||
|
String get info =>
|
|||
|
'car: ${manufacturer ?? 'unknown'}; max speed: $maxSpeed, price \$: ${priceInDollars.toStringAsFixed(2)}';
|
|||
|
|
|||
|
set price(double priceInRubles) => priceInDollars = priceInRubles / 100;
|
|||
|
}
|
|||
|
|
|||
|
// Пример работы с объектами класса Car
|
|||
|
void cars() {
|
|||
|
final unknown = Car(100);
|
|||
|
final lada = Car(110, manufacturer: 'VAZ');
|
|||
|
lada.price = 26000.00;
|
|||
|
final bmw = Car(120, manufacturer: 'BMW');
|
|||
|
bmw.price = 104000.23;
|
|||
|
|
|||
|
print(unknown.getInfo());
|
|||
|
print(unknown.info);
|
|||
|
print(lada.getInfo());
|
|||
|
print(lada.info);
|
|||
|
print(bmw.getInfo());
|
|||
|
print(bmw.info);
|
|||
|
print(lada.canReachSpeed(120));
|
|||
|
print(bmw.canReachSpeed(120));
|
|||
|
}
|
|||
|
|
|||
|
class MyTest {
|
|||
|
final int publicField;
|
|||
|
final int _privateField = 10;
|
|||
|
|
|||
|
MyTest(this.publicField);
|
|||
|
}
|
|||
|
|
|||
|
abstract class Vehicle {
|
|||
|
final int maxSpeed;
|
|||
|
|
|||
|
Vehicle(this.maxSpeed);
|
|||
|
|
|||
|
bool canReachSpeed(int speed) => speed <= maxSpeed;
|
|||
|
}
|
|||
|
|
|||
|
class Car2 extends Vehicle {
|
|||
|
final String? manufacturer;
|
|||
|
|
|||
|
double priceInDollars = 0;
|
|||
|
|
|||
|
Car2(super.maxSpeed, {this.manufacturer});
|
|||
|
|
|||
|
// Именованный конструктор
|
|||
|
Car2.lada(super.maxSpeed) : manufacturer = 'VAZ';
|
|||
|
|
|||
|
String get info => 'car2: ${manufacturer ?? 'unknown'}; max speed: $maxSpeed';
|
|||
|
}
|
|||
|
|
|||
|
void cars2() {
|
|||
|
final unknown = Car2(100);
|
|||
|
final lada = Car2.lada(110);
|
|||
|
final bmw = Car2(120, manufacturer: 'BMW');
|
|||
|
|
|||
|
print(unknown.info);
|
|||
|
print(lada.info);
|
|||
|
print(bmw.info);
|
|||
|
print(lada.canReachSpeed(120));
|
|||
|
print(bmw.canReachSpeed(120));
|
|||
|
}
|
|||
|
|
|||
|
void main(List<String> arguments) {
|
|||
|
// Вывод данных в консоль
|
|||
|
print('Hello!');
|
|||
|
|
|||
|
// Вызов функции
|
|||
|
//variablesAndDatatypes();
|
|||
|
|
|||
|
//record();
|
|||
|
|
|||
|
//constants();
|
|||
|
|
|||
|
//variables();
|
|||
|
|
|||
|
//nullables();
|
|||
|
|
|||
|
// Использование Random из стороннего компонента dart:math
|
|||
|
//print(Random().nextDouble());
|
|||
|
|
|||
|
// formattedStrings();
|
|||
|
|
|||
|
// enums();
|
|||
|
|
|||
|
// conditions();
|
|||
|
|
|||
|
// Пример работы с функциями
|
|||
|
/*const gender = GenderType.man;
|
|||
|
print(isAMan(gender));
|
|||
|
print(isAWoman(gender));
|
|||
|
const s = 'Hello';
|
|||
|
myPrint(s);
|
|||
|
myPrint(s, capitalize: true);
|
|||
|
myPrint(s, suffix: '?');
|
|||
|
myPrint(s, capitalize: true, suffix: '!');
|
|||
|
myPrint(s, suffix: '!', capitalize: true);*/
|
|||
|
|
|||
|
// Пример работы с обобщениями (щаблонными типами)
|
|||
|
/*printList([1, 2, 3, 4]);
|
|||
|
printList([1.0, 2, 3, 4]);
|
|||
|
printList(['1', '2', '3', '4']);
|
|||
|
printList([1, '2', '3', '4']);*/
|
|||
|
|
|||
|
// Пример анонимных функций
|
|||
|
/*[1, 2, 3, 4].forEach((int val) => print(val));
|
|||
|
[1, 2, 3, 4].forEach(print);
|
|||
|
print([1, 2, 3, 4].reduce((int a, int b) {
|
|||
|
return a + b;
|
|||
|
}));*/
|
|||
|
|
|||
|
// Примеры работы с циклами
|
|||
|
// loops();
|
|||
|
|
|||
|
// cars();
|
|||
|
|
|||
|
/*final myTest = MyTest(2);
|
|||
|
print(myTest.publicField);
|
|||
|
print(myTest._privateField);
|
|||
|
|
|||
|
final myTest2 = MyTest2(2);
|
|||
|
print(myTest2.publicField);
|
|||
|
// print(myTest2._privateField);*/
|
|||
|
|
|||
|
// Пример работы со статическими полями класса
|
|||
|
/*final st1 = MyStatic();
|
|||
|
final st2 = MyStatic();
|
|||
|
print(st1.static);
|
|||
|
print(st2.static);
|
|||
|
MyStatic.staticField++;
|
|||
|
print(st1.static);
|
|||
|
print(st2.static);
|
|||
|
print(MyStatic.staticField);*/
|
|||
|
|
|||
|
// final v = Vehicle(10);
|
|||
|
|
|||
|
// cars2();
|
|||
|
}
|