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

TGINSIGHT SIMILAR POSTS

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

Изходен канал @clockstackwheels · Post #337 · 7.05

На днях Еврокомиссия предъявила компании Apple обвинения в нарушении антимонопольного законодательства. Если дело выгорит, то яблокам грозит по-настоящему серьёзный штраф — до 20% от всего оборота. Нарушение как раз состоит в том, что Apple под флагом безопасности, как она это любит, запрещает сторонним приложениям использовать NFC-модуль для оплаты. Я уже об этом писал: на андроидах после блокировок можно платить телефоном через MirPay и аналоги, а вот айфоны вообще остались без инструмента оплаты в России. Это, конечно, совпадение, что такие разборки идут нам — русским, оставшимся в стране — на руку. Начало сбора материалов для этого дела было задолго до текущих событий. Впрочем, окончательно текст нужного закона согласован в ЕС только 24 марта — и я уверен, что они одним глазком посматривали на происходящее в России. Так, на всякий случай. Там в законе много интересного: 1. Компании обязаны давать пользователям возможность менять браузер по умолчанию и поисковый движок. Интересно, заставит ли это Apple разрешить использовать в сторонних браузерах какой-то иной движок, кроме Safari? Ведь из-за этого сам смысл альтернативных программ для просмотра web-страниц теряется почти полностью. 2. Платформам запрещается под угрозой исключения из магазина навязывать свои средства обработки платежей в приложениях. Судя по всему, здесь сыграл роль иск от Epic Games. 3. От встроенных средств обмена сообщениями требуют interoperability. Непонятно, означает ли это возможность работы между протоколами (например, отправлять из iMessage сообщения в WhatsApp), или всё-таки что-то не столь значительное. 4. Ну и да, разработчики смартфонов обязаны предоставить fair access to the supplementary functionalities, к которым относят и NFC. В теории это может означать ещё и, например, право для несистемных приложений выполнять на iOS фоновые процессы (сейчас это возможно только в качестве реакции на изменение координат). Мне нравится этот процесс и с чисто практической точки зрения и с идеологической. Я уже писал о том, что монополии — один из наиболее значительных недостатков капитализма. В теории вроде бы всё честно: компания делает продукт и имеет право предоставлять его людям на удобных ей условиях, потому что это их продукт. Но в данном случае Европа пользуется правом сильного, потому что может. Иронично: крупные компании по праву сильного и благодаря наличию возможности вставляют палки в колёса обычным потребителям, которые из-за этого не полностью могут пользоваться собственными же смартфонами. А антимонопольные комиссии по праву сильного и благодаря наличию возможности вставляют палки в колёса компаниям, которые из-за этого не полностью могут определять условия продаже собственной же продукции. #gadgets#web

Hashtags

Резултати

Намерени 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