Surf Flutter Team – Telegram
Surf Flutter Team
3.13K subscribers
676 photos
54 videos
265 links
Комьюнити Flutter-разработчиков Surf.

🛠 Разработали решения для KFC, Росбанка и Medium Quality
📚 Делимся полезными материалами и обучаем стажёров

💬 Чат → https://news.1rj.ru/str/+aJbtJ4znXCBhOGIy

🧑🏻‍💻 Вакансии: career.surf.ru
📲 По вопросам @SurfAskBot
Download Telegram
Передача параметра в метод: по ссылке или по значению?

Недавно в командном чатике коснулись вопроса о способах передачи параметра в метод. И вот вам небольшая задачка.

Попробуйте определить вывод у такого на первый взгляд нехитрого кода:

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-0 V-1
N-2 V-2
N-0 V-1

Ссылка из бонус-сектора карточек — статья Numbers in Dart.
👍17🔥86
Late нам друг или враг? ⚠️
Иногда — враг

Вместе с Sound null safety в 2021 году появилось новое ключевое слово 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
👍172🔥2
Dart 3: что нового

В подкасте Flutter Dev Podcast мы пытались предсказать, что поменяется в языке. И выпуск оказался пророческим!

Flutter Engineering Manager в Surf Марк Абраменко рассказал, как новые фичи помогут на практике и как от этого изменится способ взаимодействия с языком.

👉 Смотреть, лайкать, комментировать — по ссылке.

#экспертный
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍3👏3
Приглашаем на митап с Yandex Go и Akvelon 🙋

Surf Flutter Team ждут тебя на митапе в Грузии — ламповым комьюнити обсудим последние апдейты Dart, обменяемся опытом и круто проведём время.

📅 1 июня, 19:00
🏢 Тбилиси, ул. Шалва Нуцубидзе, 129
(10 минут от станции метро Важа-Пшавела)

Смотри программу митапа в карточках и регистрируйся по ссылке.

#мероприятия
🔥213👏2🤣1
Что такое typedef

typedef — сокращение от type definition или «определение типа».

В документации используется понятие «type alias» — «псевдоним типа», которое ближе к сути. По факту мы просто создаем псевдоним (синоним) для существующего типа данных или функции с целью повышения читаемости кода (иногда эти самые типы могут быть очень сложные или ни о чем не говорящие). Это достаточно старая штука и само ключевое слово typedef также используется в C/C++.

Пример для псевдонимов типов:

typedef SuggestionsState = ListenableState<EntityState<List<ProductEntity>>>;

typedef RequestBody<T> = Map<String, Map<String, T>>;

Кстати, возможность сделать так, как указано выше, появилась только два года назад в версии 2.13. Раньше typedef можно было использовать только для функций. А до версии 1.24 вы обязаны были создать typedef, чтоб передавать функцию, например, как параметр.

Надо еще сказать, что псевдонимы для типов данных используются не часто, чаще можно встретить для функций, вроде таких:

typedef DataWidgetBuilder<T> = Widget Function(BuildContext context, T data);

typedef ColorChangeCallback = void Function(Color color);
👍2061🔥1
Forwarded from Surf Tech
(барабанная дробь) 🥁 Объявляем даты летней школы!

Наши комменты и сообщения только об одном — летняя школа. В этом году она будет! На картинках делимся расписанием, а ниже напоминаем, что за школы вообще такие:

🤟 Лекции и мастер-классы по направлениям разработки, аналитики, проджект-менеджмента и тестирования;
🤟 Преподаватели — опытные Сёрферы и менторы наших стажёров и джунов;
🤟 Чатики, где обмениваются опытом и нетворкают;
🤟 Возможность закрыть практику в вузе, получить сертификат и проект в портфолио;
🤟 Из бонусов: мемы, живое общение, хорошее настроение.

🏆 Вдобавок ко всему, лучшие участники могут стать частью команды Surf!

Ждём всех, кому интересны IT и мобильная разработка. Выбирай направление и регистрируйся!

#мероприятия
🔥9🤩31