Безопасно ли использовать SharedFlow для навигации, управляемой ViewModel?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Безопасно ли использовать SharedFlow для навигации, управляемой ViewModel?

Сообщение Anonymous »

Я реализовал навигацию на основе ViewModel, как показано в моем коде ниже. Основная идея — это класс Singleton NavigationManager, который доступен как для составных объектов, так и для ViewModel, посредством внедрения зависимостей. NavigationManager имеет свойство SharedFlow с именем Direction, которое можно изменить, например. ViewModel и наблюдается составными объектами.
Теперь мой вопрос по этому поводу:
Безопасно ли использовать SharedFlow в этой ситуации? Поскольку SharedFlow является горячим потоком и, следовательно, может генерировать события, оставаясь при этом незамеченным, возможно ли, что события навигации будут потеряны? Например. возможно ли, что событие навигации генерируется, когда пользователь поворачивает свой телефон, а NavigationManger.direction SharedFlow не наблюдается в течение короткого времени (поскольку действие воссоздается при вращении)?
// MainActivity.kt
// navigationManager.direction is observed here
// NavigationManager is a Singleton injected via dependency injection
@AndroidEntryPoint
class MainActivity : ComponentActivity() {

@Inject
lateinit var navigationManager: NavigationManager

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyJetpackComposeTheme {
val navController = rememberNavController()

MyNavHost(navController)

LaunchedEffect(navigationManager.direction) {
navigationManager.direction.collect { direction ->
direction?.let {
Log.i("NavTest", "change route to: $direction")
navController.navigate(direction)
}
}
}
}
}
}
}

// The navigation manager. Instantiating it is done by the
// depdendency injection framework, not shown here for brevitiy
class NavigationManager(private val externalScope: CoroutineScope) {
private val _direction = MutableSharedFlow()
val direction : SharedFlow = _direction

fun navigate(direction: String) {
Log.d("NavTest", "navigating to $direction")

externalScope.launch {
_direction.emit(direction)
}
}
}

// triggering navigation from inside a ViewModel would be like this
// (navigationManger would be injected via dependency injection)
navigationManager.navigate("some_direction")


Подробнее здесь: https://stackoverflow.com/questions/725 ... navigation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»