Irbisa · Шпаргалка
Продвинутый Dart
Обобщения, расширения, примеси, изоляты, продвинутый dart:core
Что такое изолят в Dart и когда стоит выносить в него работу?
import 'dart:convert';import 'dart:isolate'; class User { final String name; User(this.name);…Что на самом деле делает модификатор
lateи когда он неуместен?class _EditorState extends State<Editor> with SingleTickerProviderStateMixin { // lazy: the initializer needs `this`, so it runs on first read late final AnimationController _anim = AnimationController( vsync: this, duration: const Duration(milliseconds: 200),…В крашлоге
Bad state: No element, и стектрейс указывает на вызовfirstWhere. Что произошло и что писать вместо этого?import 'package:collection/collection.dart'; class Order { final bool isPending; final int cents; const Order(this.isPending, this.cents);…Как работают дженерики и ограничения типов (bounds) в Dart и зачем они переиспользуемым виджетам и data-классам?
// A bound lets the body call compareTo on TT maxOf<T extends Comparable<T>>(List<T> xs) => xs.reduce((a, b) => a.compareTo(b) >= 0 ? a : b); // A generic function: T is fixed per callT first<T>(List<T> xs) => xs.first;…Найдите баг:
markSeenпадает во время выполнения вместо того, чтобы запомнить, что фото просмотрено.class Photo { Photo(this.id); final int id; }class Meta { bool seen = false; } // Per-photo UI flags without touching Photo.final _meta = Expando<Meta>('photoMeta'); void markSeen(Photo photo) { final meta = _meta[photo.id] ?? Meta(); meta.seen = true; _meta[photo.id] = meta;} void main() { markSeen(Photo(7)); print('marked');}Extension-методы: что выведет эта программа и какое одно правило объясняет все четыре строки?
class Animal {}class Dog extends Animal {}extension AnimalX on Animal { String speak() => 'animal'; }extension DogX on Dog { String speak() => 'woof'; } class Cat { String speak() => 'meow'; }extension CatX on Cat { String speak() => 'purr'; } void main() { final Animal a = Dog(); print(a.speak()); print(Dog().speak()); print(Cat().speak()); final dynamic d = Dog(); print(d.speak());}Почему
list.map(...)ничего не выполняет до вызоваtoList()и когда эта ленивость бьёт по рукам?void main() { final nums = [1, 2, 3]; final doubled = nums.map((n) { print('mapping $n'); // does not run yet return n * 2;…Что такое генераторы
sync*иasync*и когда их стоит писать?// sync*: values are produced only as the caller asks for themIterable<int> naturals() sync* { var n = 0; while (true) { yield n++; // naturals().take(3) gives 0, 1, 2 }…Что выведет эта программа с генератором
sync*?Iterable<int> count() sync* { print('start'); for (var i = 1; i <= 3; i++) { print('yield $i'); yield i; } print('end');} void main() { final numbers = count(); print('created'); print(numbers.first); print(numbers.first);}Что такое
Uint8Listи другие typed-data списки и когда использовать их вместоList<int>?import 'dart:typed_data'; void main() { final bytes = Uint8List(4); bytes[0] = 300; print(bytes[0]); // 44: only the low 8 bits are kept…Найдите баг:
byId[selected.id]печатаетnull, хотяselectedвзят из того же самого списка строк.class Row { Row(this.id, this.text); final int id; final String text;} var _nextId = 0;Row _toRow(String line) => Row(_nextId++, line); void main() { final rows = ['a', 'b', 'c'].map(_toRow); final selected = rows.first; final byId = {for (final r in rows) r.id: r}; print(byId[selected.id]?.text);}Что происходит между Dart-исходниками и release-бинарником (kernel,
gen_snapshot, tree shaking)?Как работает сборщик мусора в Dart (молодое и старое поколение) и что это значит для Flutter-кода?
Есть ли в Dart рефлексия? Почему
dart:mirrorsнедоступен во Flutter и чем его заменяют?Как
WeakReferenceиExpandoпозволяют GC забрать закешированные объекты и почемуFinalizerне деструктор?class DecodedImage { DecodedImage(this.bytes); final int bytes; } // a cache the garbage collector is allowed to emptyclass ThumbCache { final _entries = <String, WeakReference<DecodedImage>>{};…