#android #android-jetpack-compose
Вопрос:
Я использую функцию Composes collectAsState() для сбора данных из этого потока состояний
val _authToken = MutableStateFlow(AuthToken("", 0))
val authToken: StateFlow<AuthToken> = _authToken
val authToken by loginViewModel.authToken.collectAsState() // this returns AuthToken which is fine.
Однако при преобразовании холодного потока в поток состояний с помощью оператора stateIn, а затем с помощью collectAsState() он возвращает версию состояния объекта, которая является нечетной, тогда мне нужно вызвать .value в collectAsState (), чтобы получить его.
Кто — нибудь знает, почему это происходит?
val user = repository.getUser(viewModelScope).stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), null)
val user = profileViewModel.user.collectAsState() // returns State<User>
Ответ №1:
Заменять
val user = profileViewModel.user.collectAsState()
С
val user by profileViewModel.user.collectAsState()
Ответ №2:
Ну, это должно вернуть состояние. Compose предлагает синтаксис делегата, позволяющий обрабатывать состояния как необработанные типы.
Если вы хотите извлечь данные из State
, вы используете by
ключевое слово. Например,
var a : T by b : State<T>
и, var a : State<T> = b : State<T>
В вашем случае, если вы хотите user
иметь тип User
, а не State<User>
нет, вам следует изменить инициализацию на
val user by profileViewModel.user.collectAsState() // returns User
Кроме того, вы должны были знать из названия метода, что это CollectAs State
.