Jetpack Compose собирает государственную проблему

#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 .