data classWeather(val temperature:Int, val condition:String)
data classWeatherViewState(val loading:Boolean, val weather:Weather?, val error:String?)sealedclassWeatherViewIntent{
object LoadWeather:WeatherViewIntent()}sealedclassWeatherViewAction{
data classWeatherLoaded(val weather:Weather):WeatherViewAction()
data classWeatherError(val error:String):WeatherViewAction()}
2.ViewModel
classWeatherViewModel:ViewModel(){private val _viewState =MutableLiveData<WeatherViewState>()
val viewState:LiveData<WeatherViewState>= _viewState
fun processIntent(intent:WeatherViewIntent){
when (intent){WeatherViewIntent.LoadWeather->loadWeather()}}private fun loadWeather(){// 模拟从其他地方获取到的数据
val weather =Weather(28,"北美")// 更新界面
val loadedAction =WeatherViewAction.WeatherLoaded(weather)processAction(loadedAction)}private fun processAction(weatherViewAction:WeatherViewAction){
when (weatherViewAction){
is WeatherViewAction.WeatherLoaded->{
_viewState.value =WeatherViewState(true, weatherViewAction.weather,null)}
is WeatherViewAction.WeatherError->{
_viewState.value =WeatherViewState(false,null, weatherViewAction.error)}}}}
3.界面
classMainActivity:AppCompatActivity(){private lateinit var viewModel:WeatherViewModelprivate lateinit var text:TextViewprivate lateinit var button:Button
override fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)
text =findViewById(R.id.weather)
button =findViewById(R.id.update)
viewModel =ViewModelProvider(this).get(WeatherViewModel::class.java)
viewModel.viewState.observe(this){renderViewState(it)}
button.setOnClickListener {
viewModel.processIntent(intent =WeatherViewIntent.LoadWeather)}}private fun renderViewState(state:WeatherViewState){
when {
state.loading ->{
text.text ="温度是${state.weather?.temperature},地区是${state.weather?.condition}"}}}}