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

Читать онлайн книгу.

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


Скачать книгу
они аналогично 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 () тоже должна возвращать Future

      Stream

      Если вы знакомы с RxJava, то Вам все должно быть понятно из названия. Потоки – это последовательности (Itarable) аснихронных событий. Рассмотрим на простом примере:

      Future <int> sumStream (Stream <int> stream) async {// получаем на вход потом целых чисел

          var sum = 0;

          await for (var value in stream) {

          sum += value;}

          return sum;

      }

      Stream <int> countStream (int to) async* {

          for (int i = 1; i <= to; i++) {

             yield i; // испускаем элемент}

      }

      main () async {

         var stream = countStream (10);

         var sum = await sumStream (stream);

          print (sum); // в итоге получим 55

      }

      Слово yield испускает элемент в функции countStream, которая возвращает Stream, то есть представляет собой поток данных. Затем мы этот каждое новое значение из этого потока прибавляем к сумме предыдущих в функции sumStream.

      Исключения

      Если вы знакомы с исключениями по Java, то вкратце – все исключения в Dart unckecked. Иначе говоря, все исключения в Dart происходят в Runtime-е. Функция, которая может выбросить исключение, не обязана объявлять об этом в своей сигнатуре, а использовать эту функцию, соответственно, не обязательно в блоке try catch. Еще одно отличие от Java в том, тип исключения указывается после слова on

      void getException () {

          throw Exception (’bam!»);

      }

      try {

          getException ();

      } on Exception {

          // do something

      } catch (e) {

         print («Произошла ошибка: $e’);

      } finally {

          // После слова finally код выполнится обязательно

      closeDatabase ();

      }

      При отлавливании исключений можно использовать и on, и catch, и оба одновременно. сatch будет использоваться для доступа к объекту exception.

      Использование библиотек

      Чтобы импортировать библиотеку, пространство имен или класс, необходимо в верхней части файла прописать путь к ним после слова import

      import ’package: shapes/geometric. dart’;

      import ’package: abstracts/colored. dart’ as colored;

      …

      //


Скачать книгу