Быстрый старт Flutter-разработчика. Андрей Алеев
Чтение книги онлайн.

Читать онлайн книгу Быстрый старт Flutter-разработчика - Андрей Алеев страница 7

СКАЧАТЬ Guitarist implements Musician {

          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 () тоже должна СКАЧАТЬ