Hola, Amigos!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня рассмотрим некоторые базовые концепции пакета rxdart. Он позволяет нам работать с потоками данных еще эффективнее, так как добавляет много всего полезного.
RxDart - пакет от компании ReactiveX, которые до него уже сделали много популярных библиотек для других языков программирования. Например, RxJava или RxSwift. Но так как в Dart уже есть стримы, их не добавляли, но дополнительно улучшили, добавив методы расширений и новые типы потоков данных.
Давайте посмотрим для начала на то, как мы можем добавить буферизацию к нашему
Также иногда нам нужно отбрасывать данные и брать только последнее, что приходит. Для этого пригодятся методы
А что делать, если нужно объединить несколько потоков данных? Для этого у RxDart заготовлены несколько конструкторов. Например,
Делитесь в чате, используете ли вы RxDart на своих проектах и как он вам помогает? А мы поделимся еще несколькими полезными концептами во второй части!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня рассмотрим некоторые базовые концепции пакета rxdart. Он позволяет нам работать с потоками данных еще эффективнее, так как добавляет много всего полезного.
RxDart - пакет от компании ReactiveX, которые до него уже сделали много популярных библиотек для других языков программирования. Например, RxJava или RxSwift. Но так как в Dart уже есть стримы, их не добавляли, но дополнительно улучшили, добавив методы расширений и новые типы потоков данных.
Давайте посмотрим для начала на то, как мы можем добавить буферизацию к нашему
Stream
. Допустим, что у нас есть поток данных, который выдает информацию достаточно часто, а нам нужно получать ее не по одному, а сразу несколько штук. Для этого мы можем воспользоваться добавлением еще одного потока данных, который будет отмерять время, просто передать количество, функцию для определения конца отрезка или необходимый отрезок времени, а функции buffer
, bufferCount
, bufferTest
и bufferTime
вернут нам список данных, который накопился.Также иногда нам нужно отбрасывать данные и брать только последнее, что приходит. Для этого пригодятся методы
debounce
и debounceTime
. В первый мы можем передать какой-нибудь другой Stream
и при получении в него событий, получать данные и в изначальном. Во второй мы просто передадим время для промежутков с выдачей информации.А что делать, если нужно объединить несколько потоков данных? Для этого у RxDart заготовлены несколько конструкторов. Например,
MergeStream
, который просто добавляет события из всех стримов в себя, или CombineLatestStream
, который позволяет производить какие-либо вычисления, когда в один из стримов приходит событие, в этом случае, для других берутся последние значения.Делитесь в чате, используете ли вы RxDart на своих проектах и как он вам помогает? А мы поделимся еще несколькими полезными концептами во второй части!
👍11🔥5❤3❤🔥1
Hola, Amigos!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Мы продолжаем изучать концепции и полезные функции в rxdart.
В прошлый раз мы забыли про троттлинг. Он похож на debounce, но возвращает не последнее, а первое значение, что полезно при обработке различных случаев, например, отправки форм. Для него можно использовать методы throttle и throttleTime.
Еще давайте затронем фильтрацию данных внутри стримов, так как это часто необходимо. Да, в Dart есть метод where, но его может не хватать или он будет слишком большим в коде. Поэтому в rxdart есть расширение whereType, которое позволяет фильтровать по типу без применения cast, и его дополнение - whereNotNull, которое убирает все нулевые значения из потока данных.
Еще одно полезное расширение - distinctUnique. Оно позволяет нам сохранять в стриме только уникальные значения. Очень похоже на применение toSet().toList() для списков.
И самое главное, что добавляет rxdart - это новые StreamController, которые здесь называются Subjects. Их 2 - BehaviorSubject и ReplaySubject. Давайте посмотрим на каждый из них.
BehaviorSubject - контроллер, который при добавлении слушателя сразу же передает ему последнее значение, которое попало в стрим. Также ему можно задать изначальное значение при помощи конструктора BehaviorSubject.seeded.
ReplaySubject - контроллер, который при добавлении слушателя сразу же передаст все значения, которые в него попадали. Но если нам нужно возвращать последние N значений, то мы можем применить в его конструкторе параметр maxSize.
Делитесь в чате, как часто вы используете стримы на своих проектах?
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Мы продолжаем изучать концепции и полезные функции в rxdart.
В прошлый раз мы забыли про троттлинг. Он похож на debounce, но возвращает не последнее, а первое значение, что полезно при обработке различных случаев, например, отправки форм. Для него можно использовать методы throttle и throttleTime.
Еще давайте затронем фильтрацию данных внутри стримов, так как это часто необходимо. Да, в Dart есть метод where, но его может не хватать или он будет слишком большим в коде. Поэтому в rxdart есть расширение whereType, которое позволяет фильтровать по типу без применения cast, и его дополнение - whereNotNull, которое убирает все нулевые значения из потока данных.
Еще одно полезное расширение - distinctUnique. Оно позволяет нам сохранять в стриме только уникальные значения. Очень похоже на применение toSet().toList() для списков.
И самое главное, что добавляет rxdart - это новые StreamController, которые здесь называются Subjects. Их 2 - BehaviorSubject и ReplaySubject. Давайте посмотрим на каждый из них.
BehaviorSubject - контроллер, который при добавлении слушателя сразу же передает ему последнее значение, которое попало в стрим. Также ему можно задать изначальное значение при помощи конструктора BehaviorSubject.seeded.
ReplaySubject - контроллер, который при добавлении слушателя сразу же передаст все значения, которые в него попадали. Но если нам нужно возвращать последние N значений, то мы можем применить в его конструкторе параметр maxSize.
Делитесь в чате, как часто вы используете стримы на своих проектах?
❤9👍5❤🔥3🔥2🥰1
Hola, Amigos! На связи Михаил Чернецов, Flutter dev в Amiga. Сегодня мы поговорим про Dart FFI - инструмент, который позволяет нам встраивать нативный код, написанный на C или C++, в наши приложения, созданные на Dart.
Это позволяет ускорить некоторые сложные вычисления. При этом использование FFI, даже с интерфейсом, получается быстрее, чем вычисление на чистом дарте. Также некоторые библиотеки изначально написаны на C, и переписывание их на Dart будет дополнительной работой, требующей знания как и C, так и Dart.
В самом начале нам нужно получить собранную библиотеку - файл DLL. Для разных операционных систем он будет разным. Для Windows -
Для использования FFI нам нужно добавить 3 библиотеки - сам
Для подключения библиотеки C необходимо объявить сигнатуру функции на языке С:
Объявим также тип для функции на языке Dart
Загрузим библиотеку:
И теперь мы можем вызвать эту функцию:
Следует также учитывать, что в FFI нет типа
Для веб-приложений существует возможность использовать JS interop, которая позволяет использовать внешние JavaScript библиотеки в веб-приложении. И для этого уже существуют разработанные решения, например, пакет web.
Также существуют Java/Kotlin и Objective C/Swift интеропы, но эти фичи экспериментальны. Еще можно использовать Platform Channel для взаимодействия с нативным кодом.
А вы пробовали работать с Dart FFI на своих проектах? Делитесь в чате.
Это позволяет ускорить некоторые сложные вычисления. При этом использование FFI, даже с интерфейсом, получается быстрее, чем вычисление на чистом дарте. Также некоторые библиотеки изначально написаны на C, и переписывание их на Dart будет дополнительной работой, требующей знания как и C, так и Dart.
В самом начале нам нужно получить собранную библиотеку - файл DLL. Для разных операционных систем он будет разным. Для Windows -
.dll
, для macOS - .dylib
, для мобильных ОС - .so
. Его можно создать при помощи CMake.Для использования FFI нам нужно добавить 3 библиотеки - сам
dart:ffi
, dart:io
для работы с платформой и нахождения наших файлов и path
для помощи в этом.Для подключения библиотеки C необходимо объявить сигнатуру функции на языке С:
typedef calculator_func = Int32 Function(Int32 a, Int32 b);
Int32
является нативным типом.Объявим также тип для функции на языке Dart
typedef Calculator = int Function(int a, int b);
Загрузим библиотеку:
final dylib = ffi.DynamicLibrary.open(...);
final Calculator function = dylib
.lookup<NativeFunction<calculator_func>>(...)
.asFunction();
И теперь мы можем вызвать эту функцию:
print(function(7, 3));
Следует также учитывать, что в FFI нет типа
String
, и придется использовать Array<UInt32>
для трансляции строки в Unicode.Для веб-приложений существует возможность использовать JS interop, которая позволяет использовать внешние JavaScript библиотеки в веб-приложении. И для этого уже существуют разработанные решения, например, пакет web.
Также существуют Java/Kotlin и Objective C/Swift интеропы, но эти фичи экспериментальны. Еще можно использовать Platform Channel для взаимодействия с нативным кодом.
А вы пробовали работать с Dart FFI на своих проектах? Делитесь в чате.
🔥10❤🔥7🥰4👍2⚡1
Hola, Amigos! Наконец можем поделиться с вами записью доклада Паши Гершевича, нашего Mobile Team Lead Amiga, с конференции DevFest, которая прошла в сентябре в Омске🔥
Напомним, тема доклада: «Логирование на Flutter или какие метрики помогут в оптимизации». Разобрали самое важное:
⚙️ Зачем нужны логи разработчикам и тестировщикам
⚙️ Как сделать логи информативнее
⚙️ Какие метрики логировать в приложении и как это делать лучше всего
⚙️ Где сохранять логи, чтобы их можно было спокойно посмотреть
Запись выступления ждет вас по ссылке. Ставьте реакции, если понравился доклад Паши, и делитесь в чате, какая тема выступления вас бы точно заинтересовала!
Напомним, тема доклада: «Логирование на Flutter или какие метрики помогут в оптимизации». Разобрали самое важное:
Запись выступления ждет вас по ссылке. Ставьте реакции, если понравился доклад Паши, и делитесь в чате, какая тема выступления вас бы точно заинтересовала!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤6🥰4