Forwarded from Flutter Observer
🎉 Exciting news! Dart new version is out. Stay updated!
✅ Dart: 3.7.1
✅ Release date: 2025-02-25
✅ hash: dcddfaba8d0a77a30afceae5958c2d20fa365c71
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
✅ Dart: 3.7.1
✅ Release date: 2025-02-25
✅ hash: dcddfaba8d0a77a30afceae5958c2d20fa365c71
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
dart-dev.web.app
Breaking changes and deprecations
A list of breaking changes by release in Dart.
Forwarded from MADTeacher | Станислав Чернышев
Рубеж в 700 страниц электронной версии книги "Основы Flutter" пройден 🥳 🥳
Скорей всего на следующей неделе, после утверждения, курс на степике пополнится главой "Тестирование"🤬
Скорей всего на следующей неделе, после утверждения, курс на степике пополнится главой "Тестирование"
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18
Всем привет, @FlutterObserver_bot научился отслеживать новые статьи на Medium в разделах Flutter и Dart. Бот уведомит вас, когда на Medium появится новая статья.
Также можно всегда в разделе «Сводка» запросить три последние статьи.
Будьте в курсе новостей по Flutter с FlutterObserver.
Также можно всегда в разделе «Сводка» запросить три последние статьи.
Будьте в курсе новостей по Flutter с FlutterObserver.
🔥6
Если есть предложения по функциям, которые вы бы хотели видеть в боте @FlutterObserver_bot, или есть вопросы, или нашли баги. Пишите сюда, обсудим. Специально для этого создал отдельную тему в Хижине программиста. 😎
https://news.1rj.ru/str/FlutterObserver_bot
https://news.1rj.ru/str/FlutterObserver_bot
Forwarded from MADTeacher | Станислав Чернышев
Всем привет!
У меня для вас хорошие новости по книге "Основы Flutter" 👀
Глава по тестированию отредактирована и утверждена, а значит, на курсе "Основы Flutter" на степике большое обновление ^_^
У меня для вас хорошие новости по книге "Основы Flutter" 👀
Глава по тестированию отредактирована и утверждена, а значит, на курсе "Основы Flutter" на степике большое обновление ^_^
👍8🔥5
Тут Стас решил поделиться инфой, сколько он заработал на своем приложении. Интересное видео, рекомендую 😎
https://youtu.be/kDabZ5HohGQ?si=Flii4Ve15epZYtad
https://youtu.be/kDabZ5HohGQ?si=Flii4Ve15epZYtad
YouTube
Сколько Я ЗАРАБОТАЛ на рекламе в приложении? Вы удивитесь)
Платформа разработки Яндекса SourceCraft https://clck.ru/3Goq9M/?erid=2SDnjdPfdU8
Boosty с эксклюзивом и чатом https://boosty.to/frezycode
====================
Подписывайся на мой:
💬 Telegram https://news.1rj.ru/str/frezycode
👨💻 Куча кода GitHub https://github.com/Frezyx…
Boosty с эксклюзивом и чатом https://boosty.to/frezycode
====================
Подписывайся на мой:
💬 Telegram https://news.1rj.ru/str/frezycode
👨💻 Куча кода GitHub https://github.com/Frezyx…
🔥7❤2
Forwarded from Flutter Friendly
Привет, это Анна, Friflex Flutter Team Lead.
Признавайтесь, кому приходилось хотя бы раз писать расширения для строк, чисел и даже списков, чтобы выполнить какие-то простые преобразования или проверки, которых нет среди стандартных функций? Уверена, почти всем! Сегодня я расскажу, как перестать это делать.
Вам нужна всего одна библиотека — dartx.
Пакет дает доступ к дополнительным расширениям классов String, int, num, Iterable, DateTime, File и других, которые используются буквально в каждом проекте. Разберем самые интересные функции.
🔸 String
1️⃣
2️⃣
3️⃣
🔸 Iterable
1️⃣
2️⃣
🔸 DateTime/Duration (эти функции можно подключить отдельно через пакет time)
1️⃣
2️⃣
3️⃣
Это только малая часть того, что умеет dartx!
❤️ — если уже пользуетесь пакетом
🔥 — если только сейчас открыли для себя его чудесные функции
Признавайтесь, кому приходилось хотя бы раз писать расширения для строк, чисел и даже списков, чтобы выполнить какие-то простые преобразования или проверки, которых нет среди стандартных функций? Уверена, почти всем! Сегодня я расскажу, как перестать это делать.
Вам нужна всего одна библиотека — dartx.
Пакет дает доступ к дополнительным расширениям классов String, int, num, Iterable, DateTime, File и других, которые используются буквально в каждом проекте. Разберем самые интересные функции.
capitalize() и decapitalize() — изменят регистр только первой буквы предложенияisNotNullOrBlank и isNullOrBlank — проверят, есть ли читаемое содержимое, при этом не учитывая специальные символы по типу \n и пробеловurlEncode и urlDecode — в строке преобразуют ссылку в формат application/x-www-form-urlencoded или обратно
final capitalizedText = 'пример заглавной буквы'.capitalize(); // Пример заглавной буквы
final isBlank = ' \n'.isNullOrBlank; // true
final decodedText = 'Пример%20декодирования'.urlDecode; // Пример декодирования
sortedBy() и thenBy() — позволят вам выполнить сортировку по нескольким признакамchunkWhile() и splitWhen() — объединит в подсписки при выполнении или невыполнении условия
final dogs = [
Dog(name: "Charlie", age: 1),
Dog(name: "Bark", age: 3),
Dog(name: "Charlie", age: 6),
];
final sorted = dogs.sortedBy((dog) => dog.name).thenByDescending((dog) => dog.age); // Bark, Charlie (6), Charlie (3)
final chunckedList =[1, 2, 4, 9, 10, 11].chunkWhile((a, b) => a + 1 == b); // [[1, 2], [4], [9, 10, 11]]
isAtSameYearAs(date) — проверит, находится ли текущая дата в рамках одного и того же года даты date в параметре (есть аналогичные проверки по месяцу и дню)minutes.fromNow и minutes.ago — высчитает DateTime по указанной длительности в будущем и прошломhours — создаст Duration объект из целого числа
final tenMinutes = 10.minutes; // Duration(minutes: 10)
final isAtSameYear = DateTime(2025, 01, 01).isAtSameYearAs(DateTime(2020, 10, 05)); // false
final timeInFuture = 5.minutes.fromNow; // DatiTime.now() + 5 минут
Это только малая часть того, что умеет dartx!
❤️ — если уже пользуетесь пакетом
🔥 — если только сейчас открыли для себя его чудесные функции
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤3
Дорогие и прелестные наши девушки, поздравляю вас с 8 Марта 🎉 , желаю счастья, радости, благополучия. Не переставайте радовать нас и будьте счастливы 💐
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
Интересно, какой логикой руководствуются люди, которые ставят задачу создать полностью готовое приложение (клиент + бэкенд) за месяц? Откуда такой «крутой» менеджмент? Из курсов, где за две недели готовят IT-специалистов? Могли бы еще добавить в требования, чтобы код был идеальным, несмотря на сжатые сроки, и готовность работать 24/7. 😁 Я боюсь даже представить, каким будет качество кода и архитектуры. Разработчиков-то понять можно: они сдадут проект, получат деньги и уйдут в закат. Но почему собственники не задумываются о последствиях? Вот простая аналогия: вы хотите сделать ремонт в ванной, мастер говорит, что нужно неделю, а вы ему: «Нет, давай за три дня». Так никто не поступает, согласитесь. Потому что это своё, родное, и все понимают, что качество требует времени. Почему же в IT эти простые истины не понимают? Или считают, что это «не своё, не родное»? Странно конечно, и грустно.
👍22👏3
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Mad Brains aka madbrains
- IT-компания
- IT-компания
Mad Brains aka madbrains. Опубликовал 21 статью на Хабр и оставил 1 комментарий.
👍18
Forwarded from MADTeacher | Станислав Чернышев
🚨Большое обновление🚨 курса "Основы Flutter (в разработке)", а значит и самой книги "Основы Flutter" 🥳
Не прошло и недели, как в курс добавился сквозной проект - игра "Тетрис" для главы по Dart (2 варианта консольной версии) и Flutter (по с 2-й по 4-ю главу включительно), а нулевая глава разжилась примером работы с фичей Null-aware elements😎
В связи с добавленным объемом материалов, цена увеличивается на 300 рублей. Если вы хотели приобрести курс, но на это все никак не было "времени", по 16 марта его можно будет купить по старой цене, воспользовавшись скидкой 🫣
Но это еще не все 😇
22-го марта (суббота) в 11 часов по Мск состоится стрим с авторским коллективом, где немного приоткроем завесу тайн над написанием книги, почему выбран такой сквозной проект, как началось сотрудничество с Surf и Mad Brains по разработке лабораторного практикума к книге и многое другое🪨
Не прошло и недели, как в курс добавился сквозной проект - игра "Тетрис" для главы по Dart (2 варианта консольной версии) и Flutter (по с 2-й по 4-ю главу включительно), а нулевая глава разжилась примером работы с фичей Null-aware elements
В связи с добавленным объемом материалов, цена увеличивается на 300 рублей. Если вы хотели приобрести курс, но на это все никак не было "времени", по 16 марта его можно будет купить по старой цене, воспользовавшись скидкой 🫣
Но это еще не все 😇
22-го марта (суббота) в 11 часов по Мск состоится стрим с авторским коллективом, где немного приоткроем завесу тайн над написанием книги, почему выбран такой сквозной проект, как началось сотрудничество с Surf и Mad Brains по разработке лабораторного практикума к книге и многое другое
Please open Telegram to view this post
VIEW IN TELEGRAM
Stepik: online education
Основы Flutter: путь от Новичка до Профи
🔥 Хочешь стать Flutter-джедаем, но не знаешь, с чего начать?
Этот курс — твой билет в мир мобильной разработки! Здесь нет скучных лекций — только практика, тесты и реальный проект — Тетрис, который ты будешь прокачивать от версии v0 до полноценного приложения…
Этот курс — твой билет в мир мобильной разработки! Здесь нет скучных лекций — только практика, тесты и реальный проект — Тетрис, который ты будешь прокачивать от версии v0 до полноценного приложения…
👍7
🎉 Exciting news! Dart new version is out. Stay updated!
✅ Dart: 3.7.2
✅ Release date: 2025-03-11
✅ hash: 9594995093f642957b780603c6435d9e7a61b923
Новости от @FlutterObserver_bot
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
✅ Dart: 3.7.2
✅ Release date: 2025-03-11
✅ hash: 9594995093f642957b780603c6435d9e7a61b923
Новости от @FlutterObserver_bot
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
Telegram
Flutter Observer
Track changes and updates in the Flutter and Dart repositories in real-time.
👍3
Forwarded from MADTeacher | Станислав Чернышев
‼️В спецификацию Dart готовится обновление‼️
Замечен черновик новой фичи - Generic Constructors😩
Не прошло и пары месяцев с упоминания о предыдущем заходе на поле конструкторов с фичей Enhanced Constructors, как команда Dart, в тайне от сообщества, начала работу над черновиком еще одного конструктора... на этот раз - универсального...🛑
По задумке разработчиков, Generic-конструкторы должны позволить объявлять конструкторы с собственными параметрами типов, которые не отражаются напрямую в типе возвращаемого объекта. Это значит, что можно задавать дополнительные зависимости между аргументами конструктора. Сейчас приходится приходится прибегать к менее безопасным способам.
Планируется 2 типа Generic-конструкторов 🫠
1️⃣ Простой
На данный момент, если требуется задать связь между параметрами конструктора (например, значение и функция для его вычисления), приходится использовать универсальные типы вроде Object? и Function, что снижает статическую проверку типов:
с появлением этого конструктора можно будет явно указать зависимость между параметрами, исключая необходимость runtime-проверок
2️⃣ Условный
С помощью этого типа Generic-конструктора можно будет объявлять конструкторы, которые корректно работают только при определенных типовых аргументах.
Сейчас приходится писать такой код
использование универсального конструктора сделает его более лаконичным:
p.s. Вот теперь я уже точно уверен, что в команде Dart нашелся какой-то маньяк конструкторов... иначе как объяснить такой набор: по-умолчанию, фабричный, именованный, константный, а теперь вот еще первичный, объявляющий, расширенный и универсальный?👀
👍 - больше конструкторов Богу конструкторов
👌 - сомнительно, но Окей
👎 - не вижу от него пользы
#dart_lang@madteacher_channel
Замечен черновик новой фичи - Generic Constructors
Не прошло и пары месяцев с упоминания о предыдущем заходе на поле конструкторов с фичей Enhanced Constructors, как команда Dart, в тайне от сообщества, начала работу над черновиком еще одного конструктора... на этот раз - универсального...
По задумке разработчиков, Generic-конструкторы должны позволить объявлять конструкторы с собственными параметрами типов, которые не отражаются напрямую в типе возвращаемого объекта. Это значит, что можно задавать дополнительные зависимости между аргументами конструктора. Сейчас приходится приходится прибегать к менее безопасным способам.
Планируется 2 типа Generic-конструкторов 🫠
На данный момент, если требуется задать связь между параметрами конструктора (например, значение и функция для его вычисления), приходится использовать универсальные типы вроде Object? и Function, что снижает статическую проверку типов:
class C {
final int i;
C(this.i);
C.computed(Object? x, Function func): this(func(x)); // Unsafe!
} с появлением этого конструктора можно будет явно указать зависимость между параметрами, исключая необходимость runtime-проверок
class C {
final int i;
C(this.i);
C.computed<X>(X x, int Function(X) func) : this(func(x));
}
void main() {
C(42); // Обычный конструктор.
C.computed('Hello', (s) => s.length); // Автоматическое выведение типа.
C.computed<String>('Hello', (s) => s.length); // Явное указание типа.
}С помощью этого типа Generic-конструктора можно будет объявлять конструкторы, которые корректно работают только при определенных типовых аргументах.
Сейчас приходится писать такой код
class D<X> {
final X x;
final int Function(X, X) _compare;
D(this.x, this._compare);
D.ofComparable(X x): // Unsafe!
this(x, (dynamic x1, dynamic x2) => x1.compareTo(x2)) {
// Check at run-time that `X extends Comparable<X>`.
if (<X>[] is! List<Comparable<X>>) {
throw ArgumentError("The type argument failed"
" to satisfy `X extends Comparable<X>`.");
}
}
}использование универсального конструктора сделает его более лаконичным:
class D<X> {
final X x;
final int Function(X, X) _compare;
D(this.x, this._compare);
D<X>.ofComparable<X extends Comparable<X>>(X x)
: this(x, (x1, x2) => x1.compareTo(x2));
}
void main() {
D.ofComparable(1); // OK, num удовлетворяет Comparable.
D.ofComparable<num>(1); // Тоже OK.
D.ofComparable(C(42), (c1, c2) => c1.i.compareTo(c2.i)); // OK.
D.ofComparable(C(42)); // Ошибка компиляции – тип не соответствует.
}p.s. Вот теперь я уже точно уверен, что в команде Dart нашелся какой-то маньяк конструкторов... иначе как объяснить такой набор: по-умолчанию, фабричный, именованный, константный, а теперь вот еще первичный, объявляющий, расширенный и универсальный?👀
👍 - больше конструкторов Богу конструкторов
👌 - сомнительно, но Окей
👎 - не вижу от него пользы
#dart_lang@madteacher_channel
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👎7
🎉 Потрясающие новости! Вышла новая версия Flutter!
✅ Flutter: 3.29.2
✅ Dart: 3.7.2
✅ Release date: 2025-03-13
✅ hash: c23637390482d4cf9598c3ce3f2be31aa7332daf
Новости от @FlutterObserver_bot
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
Короткие изменения согласно changelog:
🔄 Импеллер: текст, повернутый на 180 градусов, отображается неправильно. Исправлено масштабирование с вместо !
🔧 Исправлены сбои на устройствах Android старше API 29 при использовании импеллера OpenGLES.
🚫 Исправлена ошибка отсутствия глифа на устройствах Android и iOS.
📱 На устройствах iOS увеличено количество одновременных задач декодирования фонового изображения, чтобы устранить ошибки «Не удалось загрузить изображение из-за потери доступа к графическому процессору».
🚀 Повышение производительности рендеринга CanvasKit для web.
iOS исправляет сбой при выделении поверхности для .
🧰 Всегда используйте аппаратные буферы Android для просмотра платформы, если они поддерживаются.
🆕 Исправлена двойная загрузка canvaskit.wasm.
🔧 Добавлен пустой ввод-вывод для Android apps после миграции встраиваемого модуля версии v2.
🛠️ Для всех платформ исправлен сбой при одновременной анимации и взаимодействии с прокручиваемым объектом.
📱 На Android используйте Open GL вместо Vulkan MediaTek Soc.
✅ Flutter: 3.29.2
✅ Dart: 3.7.2
✅ Release date: 2025-03-13
✅ hash: c23637390482d4cf9598c3ce3f2be31aa7332daf
Новости от @FlutterObserver_bot
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
Короткие изменения согласно changelog:
🔄 Импеллер: текст, повернутый на 180 градусов, отображается неправильно. Исправлено масштабирование с вместо !
🔧 Исправлены сбои на устройствах Android старше API 29 при использовании импеллера OpenGLES.
🚫 Исправлена ошибка отсутствия глифа на устройствах Android и iOS.
📱 На устройствах iOS увеличено количество одновременных задач декодирования фонового изображения, чтобы устранить ошибки «Не удалось загрузить изображение из-за потери доступа к графическому процессору».
🚀 Повышение производительности рендеринга CanvasKit для web.
iOS исправляет сбой при выделении поверхности для .
🧰 Всегда используйте аппаратные буферы Android для просмотра платформы, если они поддерживаются.
🆕 Исправлена двойная загрузка canvaskit.wasm.
🔧 Добавлен пустой ввод-вывод для Android apps после миграции встраиваемого модуля версии v2.
🛠️ Для всех платформ исправлен сбой при одновременной анимации и взаимодействии с прокручиваемым объектом.
📱 На Android используйте Open GL вместо Vulkan MediaTek Soc.
docs.flutter.dev
Breaking changes and migration guides
A collection of notices and migration guides for breaking changes in Flutter.
👍8🔥3
Forwarded from Flutter Friendly
Привет, с вами Роза, Flutter Dev Friflex👋 И сегодня мы немного погрузимся в магию FutureOr!
Представьте, вы создаете некий абстрактный класс с различными методами, но точно не знаете, будет ли реализация асинхронной или синхронной. Конечно, вы можете создать два метода или изощряться с разными подходами, но действительно ли это хорошее решение?
Лучше, если вы объявите метод, как FutureOr.
Звучит пока не очень понятно? Давайте разберемся на примерах.
Предположим, мы разрабатываем сервис, который получает данные. Одна реализация будет синхронной, другая — асинхронной:
Aбстрактный класс
⚙️ Когда же использовать FutureOr?
FutureOr — ваш спаситель, когда вам нужно абстрагироваться от того, является ли результат операции асинхронным или синхронным.
🔧 Как обрабатывать FutureOr?
Самый простой способ — использовать проверку типа с помощью is Future.
Да, такой вариант решения может показаться не самым элегантным. Ведь чрезмерное использование is Future может запутать логику и сделать код менее читаемым. Но в некоторых случаях, особенно при работе с абстракциями, это вполне рабочий и понятный подход.
У меня с работой так же. Иногда мне нужен await, чтобы подумать, а иногда все складывается супер. А у вас?
Представьте, вы создаете некий абстрактный класс с различными методами, но точно не знаете, будет ли реализация асинхронной или синхронной. Конечно, вы можете создать два метода или изощряться с разными подходами, но действительно ли это хорошее решение?
Лучше, если вы объявите метод, как FutureOr.
FutureOr<T> — это такой хитрый тип в Dart, который говорит: «Эй, результат моего метода может быть либо обычным значением типа T, либо Future<T>, если вдруг придется подождать».Звучит пока не очень понятно? Давайте разберемся на примерах.
Предположим, мы разрабатываем сервис, который получает данные. Одна реализация будет синхронной, другая — асинхронной:
import 'dart:async';
abstract class SomeService {
FutureOr<String> fetch();
}
class FirstImplService extends SomeService {
@override
Future<String> fetch() async {
await Future.delayed(Duration(seconds: 2));
return 'Данные из Future';
}
}
class SecondImplService extends SomeService {
@override
String fetch() {
return 'Простые данные';
}
}
Aбстрактный класс
SomeService объявляет метод fetch() с типом возвращаемого значения FutureOr<String>. Это значит, что fetch() может вернуть либо String, либо Future<String>.FutureOr — ваш спаситель, когда вам нужно абстрагироваться от того, является ли результат операции асинхронным или синхронным.
Самый простой способ — использовать проверку типа с помощью is Future.
Да, такой вариант решения может показаться не самым элегантным. Ведь чрезмерное использование is Future может запутать логику и сделать код менее читаемым. Но в некоторых случаях, особенно при работе с абстракциями, это вполне рабочий и понятный подход.
У меня с работой так же. Иногда мне нужен await, чтобы подумать, а иногда все складывается супер. А у вас?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Forwarded from MADTeacher | Станислав Чернышев
Всем привет!
У меня для вас хорошие новости по книге "Основы Flutter" 👀
Глава по локализации утверждена, а значит, в курсе "Основы Flutter" на степике обновление ^_^
Напоминаю, что уже завтра в 11 часов по Мск состоится стрим с авторским коллективом, где немного приоткроем завесу тайны над написанием книги, почему выбран такой сквозной проект, как началось сотрудничество с Surf и Mad Brains по разработке лабораторного практикума к книге и многое другое🪨
У меня для вас хорошие новости по книге "Основы Flutter" 👀
Глава по локализации утверждена, а значит, в курсе "Основы Flutter" на степике обновление ^_^
Напоминаю, что уже завтра в 11 часов по Мск состоится стрим с авторским коллективом, где немного приоткроем завесу тайны над написанием книги, почему выбран такой сквозной проект, как началось сотрудничество с Surf и Mad Brains по разработке лабораторного практикума к книге и многое другое
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
Forwarded from MADTeacher | Станислав Чернышев
Начинаем стрим авторского коллектива "Основы Flutter". Подключайтесь: https://youtube.com/live/oJkjpluOhFE?feature=share
YouTube
Мы пишем книгу по Flutter | Созвон авторов feat Стас Чернышев, Юрий Петров, Павел Гершевич
Предварительный доступ к книге: https://stepik.org/a/197817
00:00 - Подготовка
02:50 - Начинаем
03:50 - Как появилась идея создать книгу ?
09:52 - Зачем книга если джуны не нужны ?
11:22 - Есть ли будущее у Flutter ?
18:35 - Будет ли про Flutter Web и Desktop…
00:00 - Подготовка
02:50 - Начинаем
03:50 - Как появилась идея создать книгу ?
09:52 - Зачем книга если джуны не нужны ?
11:22 - Есть ли будущее у Flutter ?
18:35 - Будет ли про Flutter Web и Desktop…
👍3
Forwarded from Стас Ильин | Flutter
❤️ Спасибо большое всем кто был на трансляции
🤟 Отличный онлайн собрали для субботнего утра! И отдельное спасибо всем кто задавал вопросы, вышло интересное обсуждение
Для вашего удобства сразу добавил подробные таймкоды, ведь мы обсуждали не только книгу но и кучу других вопрсов
📺 Для тех кто не мог смотреть в онлайне запись трансляции достпуна на канале
Для вашего удобства сразу добавил подробные таймкоды, ведь мы обсуждали не только книгу но и кучу других вопрсов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Forwarded from Flutter Friendly
Привет, это Катя, Flutter Dev Friflex. Сегодня поговорим о фреймворке gRPC и его реализации.
Что это?
gRPC — это фреймворк для удаленного вызова процедур (RPC), разработанный Google. Он использует HTTP/2 для транспорта и Protocol Buffers (protobuf) в качестве языка описания интерфейсов и формата сериализации данных.
Настройка и использование gRPC
1️⃣ Добавляем в pubspec.yaml:
2️⃣ Создаем файл .proto
Сделаем на примере создания чата. Определяем сервис в файле .proto. Например, lib/protos/chat.proto:
3️⃣ Генерируем код
Запускаем команду для генерации Dart-кода:
4️⃣ Создаем клиента
5️⃣ Используем клиента в приложении
На что следует обратить внимание:
🔸 gRPC клиент:
➡️ инициализируется один раз при создании состояния
➡️ обеспечивает двустороннюю коммуникацию
➡️ управляет подпиской на поток сообщений
🔸 Потоковая передача:
➡️ receiveMessages() возвращает Stream<Message>
➡️ listen() подписывается на новые сообщения
🔸 Управление ресурсами:
➡️ gRPC соединение должно закрываться
➡️ Отмена подписок происходит автоматически при dispose()
Продолжение — в комментариях📌
Что это?
gRPC — это фреймворк для удаленного вызова процедур (RPC), разработанный Google. Он использует HTTP/2 для транспорта и Protocol Buffers (protobuf) в качестве языка описания интерфейсов и формата сериализации данных.
Настройка и использование gRPC
dependencies:
grpc: ^4.1.0
protobuf: ^3.1.0
dev_dependencies:
protoc_plugin: ^21.1.2
Сделаем на примере создания чата. Определяем сервис в файле .proto. Например, lib/protos/chat.proto:
syntax = "proto3";
package chat;
service ChatService {
rpc SendMessage (Message) returns (MessageResponse);
rpc ReceiveMessages (Empty) returns (stream Message);
}
message Message {
string text = 1;
string sender = 2;
int64 timestamp = 3;
}
message MessageResponse {
bool success = 1;
string error = 2;
}
Запускаем команду для генерации Dart-кода:
bash
protoc --dart_out=grpc:lib/generated -Ilib/protos lib/protos/chat.proto
class GrpcClient {
late ChatServiceClient client;
/// Инициализация канала соединения
GrpcClient() {
final channel = ClientChannel(
'http://localhost',
port: 50051,
options: const ChannelOptions(
credentials: ChannelCredentials.insecure(),
),
);
client = ChatServiceClient(channel);
}
/// Отправка сообщения
Future<MessageResponse> sendMessage(String text, String sender) async {
final message = Message()
..text = text
..sender = sender
..timestamp = DateTime.now().millisecondsSinceEpoch;
try {
return await client.sendMessage(message);
} catch (e) {
print('Error sending message: $e');
return MessageResponse()..success = false..error = e.toString();
}
}
/// Получение сообщений
Stream<Message> receiveMessages() {
return client.receiveMessages(Empty());
}
}На что следует обратить внимание:
Продолжение — в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7