Быстрый старт Flutter-разработчика. Андрей Алеев
Чтение книги онлайн.
Читать онлайн книгу Быстрый старт Flutter-разработчика - Андрей Алеев страница 7
get name => «Guitar’;
void play () => «Hi, I can play $instrument’;
}
Примеси (mixins)
Примесь, или Mixin в языке Dart – это класс, описывающий некоторое поведение. Он чем-то напоминает интерфейс, однако правила его использования несколько отличаются. Примеси не наследуются, а как бы подключаются, «примешиваются» к коду класса, поэтому и называются примесями. Отличие от интерфейса в Java заключается в том, что методы примеси уже не надо переопределять.
Посмотрим на примере. Предположим, нам нужно описать музыканта, который умеет играть разные стили музыки.
// Гитарист имплиментирует Музыканта и умеет играть разные стили
class Guitarist implements Musician with Jazz, Rock, Funk {
get name => «Guitar’;
void play (String arg) => «Hi, I can play $arg by $instrument’;
}
// примесь Rock
mixin Rock {
bool knowsHowToPlayACDC = true;
void playPopMusic () {
if (knowsHowToPlayACDC) {
play («TNT»)
}}}
mixin Jazz {
bool knowsHowToEllington = true;
void playJazzMusic () {
if (knowsHowToEllington) {
play («Take the A Train)
}}}
// примесь Funk
mixin Funk {
bool knowsHowToPlayBrown = true;
void playFunkMusic () {
if (knowsHowToPlayBrown) {
play («I FEEL GOOD!»)
}}}
Callable классы
Объекты класса можно вызывать как функции, если имплементировать в них метод call ()
class ClassAsFunction {
call (int a, int b) => a*b;
}
main () {
var classAsFunction = ClassAsFunction ();
var out = classAsFunction (2, 2); // вызываем класс как функцию
print («$out’); // получим 4
}
Дженерики
В Dart присутствует поддержка Generic-ов. Работают они аналогично Java, и применяются в повторноиспользуемых компонентах, например, в абстракциях:
abstract class Foo <T extends BaseClass> {
…
}
Если вы посмотрите исходники класса List, то увидите, что он уже содержит дженерики, поэтому в угловых скобках мы указываем тип переменных
var names = List <String> ();
names.addAll ([«Mercury’, «Venus’, «Earth’]);
names.add («Mars’); // можно
names.add (42); // ошибка типа
Асинхронные функции
Для выполнения фоновой работы в Dart есть Future и Stream объекты
Future
Future <T> – это объект, представляющий собой асинхронную операцию, которая вернет после выполнения объект типа T. Когда вызывается функция, возвращающая Future, происходят последовательно два этапа:
– эта функция ставит в очередь работу, которую она должна выполнить, и сразу же возвращает невыполненный объект Future
– Когда операция выполнена, объект Future завершаетсся с ошибкой или полученным значением
Для того, чтобы написать аснихронную функцию, ее нужно пометить как async, а саму асинхронную работу словом await:
import ’dart: async’; // стандартная библиотека для асинхронной работы
Future <void> updateData () async {
var digest = await getDataFromServer (); // дальше этой строчки мы не уйдем, пока не получим результат или ошибку
print (digest);
}
Примечание: функция getDataFromServer () тоже должна