Передача параметра в метод: по ссылке или по значению?
Недавно в командном чатике коснулись вопроса о способах передачи параметра в метод. И вот вам небольшая задачка.
Попробуйте определить вывод у такого на первый взгляд нехитрого кода:
N-0 V-1
N-2 V-2
N-0 V-1
Ссылка из бонус-сектора карточек — статья Numbers in Dart.
Недавно в командном чатике коснулись вопроса о способах передачи параметра в метод. И вот вам небольшая задачка.
Попробуйте определить вывод у такого на первый взгляд нехитрого кода:
class Test {
int val;
Test(this.val);
}
void main() {
int number = 0;
Test test = Test(0);
fn1(number, test);
print('N-$number V-${test.val}');
fn2(number, test);
print('N-$number V-${test.val}');
}
void fn1(int number, Test test) {
number = 1;
test.val = 1;
}
void fn2(int number, Test test) {
number = 2;
test = Test(2);
print('N-$number V-${test.val}');
}
Правильный ответ:N-2 V-2
N-0 V-1
👍17🔥8❤6
Late нам друг или враг? ⚠️
Иногда — враг
Вместе с Sound null safety в 2021 году появилось новое ключевое слово
Что такое late
Согласно документации, его можно использовать для двух случаев:
1️⃣ Декларирование non-nullable переменной, которая обязательно (помните об этом ⚠️) должна быть инициализирована позже.
2️⃣ Ленивая, или lazy-инициализация переменных: она происходит только при первом обращении.
Немного подробнее про использовании late для lazy-инициализации
Lazy-инициализацию используют по двум причинам:
🔹 Когда нужен доступ к
🔹 Когда хотим оптимизировать ресурсы устройства через инициализацию только действительно нужных объектов. В этом случае использовать
Правда, тут есть нюансы. Подробнее на картинках 👆👆👆
➡️ Давайте представим: вы создаёте стрим и хотите сразу создать слушателя к нему.
Вроде бы все правильно и «по-взрослому», но… вы ничего не услышите 👂— переменная
➡️ Чтобы исключить такую ситуацию, нужно определить подписку так, как на третьей картинке.
Well done! В таком виде всё будет работать. Хорошей практикой ещё будет сделать
👉 Живой пример на DartPad
late. Что такое late
Согласно документации, его можно использовать для двух случаев:
1️⃣ Декларирование non-nullable переменной, которая обязательно (помните об этом ⚠️) должна быть инициализирована позже.
2️⃣ Ленивая, или lazy-инициализация переменных: она происходит только при первом обращении.
Немного подробнее про использовании late для lazy-инициализации
Lazy-инициализацию используют по двум причинам:
🔹 Когда нужен доступ к
this для инициализации объекта. Например, для создания AnimationController нам нужно передать this в параметр vsync, т. к. контроллеру нужен TickerProvider. В этом случае мы вынуждены будем использовать late: по-другому никак.🔹 Когда хотим оптимизировать ресурсы устройства через инициализацию только действительно нужных объектов. В этом случае использовать
late необязательно, но очень желательно — а иногда даже необходимо. Правда, тут есть нюансы. Подробнее на картинках 👆👆👆
Вроде бы все правильно и «по-взрослому», но… вы ничего не услышите 👂— переменная
sub так и останется «late», она по-прежнему не инициализирована.Well done! В таком виде всё будет работать. Хорошей практикой ещё будет сделать
controller и sub приватными, если это возможно, но это уже тонкости.👉 Живой пример на DartPad
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤2🔥2
Dart 3: что нового
В подкасте Flutter Dev Podcast мы пытались предсказать, что поменяется в языке. И выпуск оказался пророческим!
Flutter Engineering Manager в Surf Марк Абраменко рассказал, как новые фичи помогут на практике и как от этого изменится способ взаимодействия с языком.
👉 Смотреть, лайкать, комментировать — по ссылке.
#экспертный
В подкасте Flutter Dev Podcast мы пытались предсказать, что поменяется в языке. И выпуск оказался пророческим!
Flutter Engineering Manager в Surf Марк Абраменко рассказал, как новые фичи помогут на практике и как от этого изменится способ взаимодействия с языком.
#экспертный
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Dart 3 на практике: что принесёт нам мажорное обновление языка
В декабре у Flutter Dev Podcast вышел выпуск про синтаксический сахар. Мы обсуждали будущее Dart, новые фичи, которые были в планах. Выпуск оказался пророческим: всё, о чём мы говорили, окажется в...
🔥20👍3👏3
На Google I/O зарелизился Dart 3, который принёс огромное количество изменений в язык. Какие ещё фичи ждёшь в Dart?
Anonymous Poll
53%
Data-классы
14%
Read-only коллекции
13%
Синтаксис range
11%
Декларирование классов внутри других классов
25%
Присваивание if-else и try-catch к переменной
13%
Возможность сделать return после «??»
16%
Фичи как в Swift — например, композиция протоколов или полноценный guard
4%
Что-то другое — напишу в комментариях
31%
Мне в Dart всего хватает
Приглашаем на митап с Yandex Go и Akvelon 🙋
Surf Flutter Team ждут тебя на митапе в Грузии — ламповым комьюнити обсудим последние апдейты Dart, обменяемся опытом и круто проведём время.
📅 1 июня, 19:00
🏢 Тбилиси, ул. Шалва Нуцубидзе, 129 (10 минут от станции метро Важа-Пшавела)
Смотри программу митапа в карточках и регистрируйся по ссылке.
#мероприятия
Surf Flutter Team ждут тебя на митапе в Грузии — ламповым комьюнити обсудим последние апдейты Dart, обменяемся опытом и круто проведём время.
📅 1 июня, 19:00
🏢 Тбилиси, ул. Шалва Нуцубидзе, 129 (10 минут от станции метро Важа-Пшавела)
Смотри программу митапа в карточках и регистрируйся по ссылке.
#мероприятия
🔥21❤3👏2🤣1
Что такое typedef
В документации используется понятие «type alias» — «псевдоним типа», которое ближе к сути. По факту мы просто создаем псевдоним (синоним) для существующего типа данных или функции с целью повышения читаемости кода (иногда эти самые типы могут быть очень сложные или ни о чем не говорящие). Это достаточно старая штука и само ключевое слово
Пример для псевдонимов типов:
Надо еще сказать, что псевдонимы для типов данных используются не часто, чаще можно встретить для функций, вроде таких:
typedef — сокращение от type definition или «определение типа». В документации используется понятие «type alias» — «псевдоним типа», которое ближе к сути. По факту мы просто создаем псевдоним (синоним) для существующего типа данных или функции с целью повышения читаемости кода (иногда эти самые типы могут быть очень сложные или ни о чем не говорящие). Это достаточно старая штука и само ключевое слово
typedef также используется в C/C++. Пример для псевдонимов типов:
typedef SuggestionsState = ListenableState<EntityState<List<ProductEntity>>>;Кстати, возможность сделать так, как указано выше, появилась только два года назад в версии 2.13. Раньше
typedef RequestBody<T> = Map<String, Map<String, T>>;
typedef можно было использовать только для функций. А до версии 1.24 вы обязаны были создать typedef, чтоб передавать функцию, например, как параметр. Надо еще сказать, что псевдонимы для типов данных используются не часто, чаще можно встретить для функций, вроде таких:
typedef DataWidgetBuilder<T> = Widget Function(BuildContext context, T data);
typedef ColorChangeCallback = void Function(Color color);👍20⚡6❤1🔥1
Forwarded from Surf Tech
Наши комменты и сообщения только об одном — летняя школа. В этом году она будет! На картинках делимся расписанием, а ниже напоминаем, что за школы вообще такие:
🤟 Лекции и мастер-классы по направлениям разработки, аналитики, проджект-менеджмента и тестирования;
🤟 Преподаватели — опытные Сёрферы и менторы наших стажёров и джунов;
🤟 Чатики, где обмениваются опытом и нетворкают;
🤟 Возможность закрыть практику в вузе, получить сертификат и проект в портфолио;
🤟 Из бонусов: мемы, живое общение, хорошее настроение.
🏆 Вдобавок ко всему, лучшие участники могут стать частью команды Surf!
Ждём всех, кому интересны IT и мобильная разработка. Выбирай направление и регистрируйся!
#мероприятия
🔥9🤩3❤1
Один из спикеров Surf Flutter Tbilisi Meetup Марк напоминает о мероприятии! Все подробности и регистрация — по ссылке.