Быстрый старт 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;
…
//