Быстрый старт Flutter-разработчика. Андрей Алеев
Чтение книги онлайн.
Читать онлайн книгу Быстрый старт Flutter-разработчика - Андрей Алеев страница 6
При объявлении функции мы можем в ее сигнатуре указать значения по умолчанию. Например, нам понадобится вызывать какую-то функцию много раз с одним и тем же параметром, но при этом необходимо сохранить гибкость. В таком случае, при вызове с функции с параметром по умолчанию, его (этот параметр) можно не указывать.
В Dart существует два типа опциональных параметров: позиционные и именованные. Рассмотрим их подробнее.
Примечание: Опциональный параметр не может быть одновременно и позиционным и именованным
Именованные – такие параметры при вызове функции можно указывать опционально с именем и последующим двоеточием и оборачиванием в фигурные скобки. Пример:
updateWidget (int position, {bool withTitle: true, int padding: 8})
Аннотация @required делает этот параметр обязательным
Позиционные – опциональные параметры, помещаемые при объявлении функции в квадратные скобки. Они будут читаться при вызове по их позиции среди аргументов.
String something (String parametr1, [String parametr2]) {
if (parametr2!= null) {
return «$parametr1 and $parametr2»;
} else {
return «$parametr1»;
}
}
Функции как объекты
Функции можно передавать в качестве параметров другим функциям, а также назначать их переменным:
void doubleIt (int it) {
it = it * 2
print (it);
}
var list = [1, 2, 3];
// передаем на выполнение в foreach функцию
list.forEach (doubleIt);
// функция как переменная
var doubleIt = (par1) => «$ {par1 * 2}»;
// функция как переменная с указанием типа
Function tripleIt = (par1) => «$ {par1 * 3}»;
Анонимные функции (лямбды)
Выше мы уже увидели пример анонимной функции – это функция не имеющая имени.
var list = [’a’, ’b’, ’c’];
list.forEach ((it) {
print («$it is ${list.indexOf (it) +1} letter of alphabet);
});
В этом примере у нас всего одно выражение в фигурных скобках, поэтому такую запись можно сократить до
list.forEach ((it) => print («$it is ${list.indexOf (it) +1} letter of alphabet));
Примечание: Переопределение методов (функций) родительского класса выполняется с помощью аннотации @override
Конструкторы
Конструкторы позволяют создать объект такого же типа, как и класс, в котором они объявлены. Выглядят они как и функции:
class Rectangle {
num width, height;
Rectangle (num width, num height) {
this. width = width;
this. height = height;
}}
Аналогично Java, если не объявлять конструктор, то будет использоваться конструктор по умолчанию – без параметров. Однако, в отличие от Java, конструкторы не наследуются.
Конструкторы могут быть именованными:
class Rectangle {
num width, height;
Rectangle (this. x, this. y)
Rectangle. square () {
this. width = 10;
this. height = 10;
}}
При наследовании классов конструкторы родительские конструкторы можно вызывать с помощью конструкции: super
class Rectangle {
num width, height;
Rectangle.fromParams (Map params) {
…
}
}
class