四川做网站的公司有哪些,网站特效模板下载,网站 当前时间 代码,办公室装修设计appAndroid StateFlow初探
前言#xff1a;
最近在学习StateFlow#xff0c;感觉很好用#xff0c;也很神奇#xff0c;于是记录了一下.
1.简介#xff1a;
StateFlow 是一个状态容器式可观察数据流#xff0c;可以向其收集器发出当前状态更新和新状态更新。还可通过其 …Android StateFlow初探
前言
最近在学习StateFlow感觉很好用也很神奇于是记录了一下.
1.简介
StateFlow 是一个状态容器式可观察数据流可以向其收集器发出当前状态更新和新状态更新。还可通过其 value 属性读取当前状态值。如需更新状态并将其发送到数据流请为 MutableStateFlow 类的 value 属性分配一个新值。
2.和Flow、LiveData联系,官网解释如下
StateFlow、Flow 和 LiveData
StateFlow 和 LiveData 具有相似之处。两者都是可观察的数据容器类并且在应用架构中使用时两者都遵循相似模式。
但请注意StateFlow 和 LiveData 的行为确实有所不同
StateFlow 需要将初始状态传递给构造函数而 LiveData 不需要。当 View 进入 STOPPED 状态时LiveData.observe() 会自动取消注册使用方而从 StateFlow 或任何其他数据流收集数据的操作并不会自动停止。如需实现相同的行为您需要从 Lifecycle.repeatOnLifecycle 块收集数据流。
3.MainViewModel代码
package com.example.stateflowdemo.viewmodelimport androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.stateflowdemo.model.LoginUIState
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
ExperimentalCoroutinesApi
class MainViewModel :ViewModel(){private val _loginUIState MutableStateFlowLoginUIState(LoginUIState.Empty)val loginUiState: StateFlowLoginUIState _loginUIStatefun login(username:String,password: String) viewModelScope.launch {_loginUIState.value LoginUIState.Loadingdelay(2000L)if(username android password 123456) {_loginUIState.value LoginUIState.Success} else {_loginUIState.value LoginUIState.Error(账号或密码不正确请重试)}}
}4.LoginUIState代码:
sealed class LoginUIState {object Success : LoginUIState()data class Error(val message: String) : LoginUIState()object Loading : LoginUIState()object Empty : LoginUIState()
}5.测试代码
package com.example.stateflowdemoimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.example.stateflowdemo.databinding.ActivityMainBinding
import com.example.stateflowdemo.model.LoginUIState
import com.example.stateflowdemo.viewmodel.MainViewModel
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.ExperimentalCoroutinesApi
OptIn(ExperimentalCoroutinesApi::class)
class MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingprivate val viewModel:MainViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)initView()initViewModel()}private fun initView() {binding.btnLogin.setOnClickListener {viewModel.login(binding.etUsername.text.toString(),binding.etPassword.text.toString())}}private fun initViewModel() {lifecycleScope.launchWhenStarted {viewModel.loginUiState.collect {listOf(when (it) {is LoginUIState.Success - {Snackbar.make(binding.root,Successfully logged in,Snackbar.LENGTH_LONG).show()binding.progressBar.isVisible false}is LoginUIState.Error - {Snackbar.make(binding.root,it.message,Snackbar.LENGTH_LONG).show()binding.progressBar.isVisible false}is LoginUIState.Loading - {binding.progressBar.isVisible true}else - Unit})}}}
}6.布局代码如下
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivitycom.google.android.material.textfield.TextInputLayoutandroid:idid/textInputLayoutandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:hintUsernameandroid:layout_marginStart20dpandroid:layout_marginEnd20dpapp:layout_constraintVertical_chainStylepackedapp:layout_constraintBottom_toTopOfid/textInputLayout2app:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.5app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentcom.google.android.material.textfield.TextInputEditTextandroid:idid/etUsernameandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:ems15 //com.google.android.material.textfield.TextInputLayoutcom.google.android.material.textfield.TextInputLayoutandroid:idid/textInputLayout2android:layout_width0dpandroid:layout_heightwrap_contentandroid:hintPasswordandroid:layout_marginTop20dpandroid:layout_marginStart20dpandroid:layout_marginEnd20dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.5app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/textInputLayoutcom.google.android.material.textfield.TextInputEditTextandroid:idid/etPasswordandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:inputTypetextPasswordandroid:ems15 //com.google.android.material.textfield.TextInputLayoutButtonandroid:idid/btnLoginandroid:layout_width150dpandroid:layout_heightwrap_contentandroid:textLoginandroid:layout_marginTop8dpapp:layout_constraintEnd_toEndOfid/textInputLayout2app:layout_constraintTop_toBottomOfid/textInputLayout2 /ProgressBarandroid:idid/progressBarandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:visibilitygoneapp:layout_constraintBottom_toBottomOfid/btnLoginapp:layout_constraintEnd_toEndOfid/textInputLayout2app:layout_constraintStart_toStartOfid/textInputLayout2app:layout_constraintTop_toTopOfid/btnLogin //androidx.constraintlayout.widget.ConstraintLayout7.实现的效果图如下 8.demo源码地址
https://gitee.com/jackning_admin/state-flow-sample