TGTGInsightтелеграм анализLIVE / telegram public index
← Такты, стеки, два колеса

TGINSIGHT SIMILAR POSTS

Намери подобно съдържание

Изходен канал @clockstackwheels · Post #342 · 12.05

DJI позавчера выпустила Mini 3 Pro — новый дрон в линейке Mini. Это модели весом до 250 граммов, чтобы их не нужно было регистрировать в большинстве стран, где дроны в принципе разрешены. Раньше в России тоже было именно такое ограничение, но потом его снизили до 150 граммов — и, кажется, сделали это именно из-за появления первой версии DJI Mini. Впрочем, я уже когда-то писал, что в России подобная проблема не стоит: регистрировать дроны легко, и делается это за 2 минуты через Госуслуги, при этом отсутствие необходимости регистрировать не спасает вас от ограничений, связанных с полётами. Дрон любого веса нельзя по закону запускать в людных местах, на высоту более 120 метров, с потерей прямой видимости, и в зонах явного ограничения (аэропорты, центральные площади столиц итд). По сути регистрация как бы мешает только съёмкам чего-то запрещённого (когда ваш дрон могут сбить, и потом по его номеру выйти на владельца). Но у меня нет никаких сомнений, что владельцев незарегистрированных дронов при полётах над условными дачами чиновников тоже найдут, если очень нужно будет. Так что, смысл в дроне весом 249 граммов есть только для путешествий, которые для жителей России сейчас потеряли актуальность, поэтому конкретно данный параметр особого интереса не представляет. Что интересно, так это несколько ключевых нововведений, главное из которых: камера, способная физически поворачиваться в вертикальное положение. Увы, вертикальное видео давно и окончательно заразило человечество, эту войну мы с вами (адекватные сторонники горизонтальных видео) с треском проиграли. Думаю, дальше будет только хуже, и в кибернетическом будущем людей ждёт операция по пересадке глаз в положение один над другим. Более позитивное нововведение — появился комплект с пультом, содержащим встроенный дисплей. Владельцы дронов знают, как утомительно каждый раз присоединять к пульту телефон, чтобы на него выводилась картинка. У DJI уже давно был в качестве отдельного товара пульт с дисплеем, но стоил он почему-то как целый дрон. Здесь же за ~$150 сверху вы получаете полное отсутствие возни с телефоном и траты его — телефона — батареи. Ещё из мелочей: камера может смотреть вверх до 60 градусов. То есть вы можете пролететь под мостом и снять его снизу. Также добавили датчики препятствий -- раньше они были только в дорогих моделях. Впрочем, и Mini сейчас уже нельзя назвать бюджетным (от $700 за самый простой вариант). Отдельно продаётся аккумулятор увеличенной ёмкости: он поднимает вес дрона выше порога в 250 граммов, зато даёт по заявлению производителя фантастические 47 минут полёта (на деле, скорее всего, будет минут 30-35, но это очень много). Считаю эту модель отличным вариантом универсального дрона для не слишком хардкорных пользователей. Он достаточно современный и с крутыми технологиями, обладает интересными фишками, супер компактный, но при этом не стоит, как настоящий вертолёт. #gadgets#drone

Резултати

Намерени 3 подобни публикации

Търсене: #viewmodel

当前筛选 #viewmodel清除筛选
Android Broadcast

@android_broadcast · Post #9572 · 18.10.2025 г., 11:35

Вот реальная история, как знание механики работы ViewModel спасло мне вечер 👇 У меня приложение на Compose и Jetpack Navigation 3 (работает на основе состояния Back Stack). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же ViewModel.❗️Баг: при переходе в папку навигация срабатывает, UI не меняется. Современные ИИ подсказали общие вещи, но не помогли — промты, видимо, подвели (тут мне ещё надо прокачать знания) 🙂 Вспомнил ключевой факт про архитектуру: 👉 Все ViewModel живут в ViewModelStore. 👉 В пределах одного ViewModelStoreOwner (Activity/Fragment/NavBackStackEntry) получение ViewModel по умолчанию идёт по типу. 👉 Если нужно несколько экземпляров одного типа на одном owner’е — используем key. Решение в одну строку — привязать ключ к ViewModel, связанный с текущей папкой: @Composable fun FileNavigator( folderId: Id, modifier: Modifier = Modifier, ) { // новый folderId → новый экземпляр ViewModel → новый UI-стейт val viewModel: FileNavigatorViewModel = viewModel( key = "files(rootId='$folderId')" ) // ... } Мини-чеклист, если ловите такой баг 👉 Один экран используется повторно с разными параметрами? → Нужен key. 👉 Меняется route, но owner тот же? → key обязателен. 👉 Используете Hilt/Koin? → У этих функций тоже есть параметр key (hiltViewModel(key=...), koinViewModel(key=...)). 👉 key должен детерминированно зависеть от входных данных (например, folderId). 👉 При навигации назад убедитесь, что ViewModel освобождается ожидаемо. Ещё нюанс - если у вас сложная иерархия графов, проверьте, к какому ViewModelStoreOwner вы реально привязаны. Рекомендую посмотреть мои видео по теме: 📹Разбор Jetpack Navigation 3 🪙Полный разбор Jetpack ViewModel в Android и Kotlin Multiplatform #android#compose#androidjetpack#viewmodel#архитектура

Android Broadcast

@android_broadcast · Post #8901 · 05.04.2025 г., 10:43

🤖Альтернативный способ обработке one-off событий из ViewModel (EN, 10м) В статье рассказывается в чем сложность с обработкой одноразовых событий, которые надо передать из ViewModel в UI. Автор рассматривает способ через callback интерфейс в конструкторе ViewModel @HiltViewModel class MyViewModel @Inject constructor( // inject the interface private val toastMessages: ToastMessages, ) : ViewModel() { fun doSomething() { viewModelScope.launch { try { // execute async operation here } catch (e: CustomException) { // initiate a one-off event toastMessages.showToast(e.localizedMessage) } } } } 🔗 Альтернативная ссылка на статью #android#viewmodel#dagger#hilt

Android Broadcast

@android_broadcast · Post #9683 · 20.11.2025 г., 14:59

🚀Lifecycle 2.10.0 вышел в стабильной версии! Google выпустила мажорное обновление библиотек Lifecycle. Этот релиз сфокусирован на улучшении интеграции с Compose. ⚙️rememberLifecycleOwner для Compose Новый композабл позволяет создавать изолированные LifecycleOwner внутри UI. Идеально для компонентов, которым нужно независимое управление состоянием — например, для HorizontalPager, где только активная страница должна быть в состоянии RESUMED. @Composable fun MyComposable() { val lifecycleOwner = rememberLifecycleOwner( maxLifecycle = Lifecycle.State.RESUMED, parentLifecycleOwner = LocalLifecycleOwner.current, ) CompositionLocalProvider( LocalLifecycleOwner provides lifecycleOwner ) { // Дочерние композаблы теперь имеют собственный жизненный цикл } } 🚀 Интеграция с Navigation 3 Новый артефакт lifecycle-viewmodel-navigation3 предоставляет готовый декоратор для автоматической привязки ViewModel к отдельным экранам в Navigation 3. NavDisplay( backStack = backStack, entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberViewModelStoreNavEntryDecorator(), // Добавляем эту строку ), entryProvider = entryProvider { /* ... */ } ) Удобства для разработчиков: 👉 Идиоматичный Kotlin API для создания кастомных CreationExtras CreationExtras { this[MY_CUSTOM_KEY] = "myValue" } 👉 Метод savedStateHandle.saved() теперь нативно поддерживает nullable типы 👉Конструкторы SavedStateHandle помечены как @VisibleForTesting ⚠️ Важное изменение Повышение minSdk с API 21 до API 23 — убедитесь, что ваше приложение соответствует новым требованиям. #Jetpack#Lifecycle#Compose#Navigation#ViewModel#Kotlin