Flow是冷流,有了订阅者Collector以后,发射出来的值才会实实在在的存在于内存之中,类似懒加载。stateFlow和SharedFlow是热流,在垃圾回收之前,都是存在内存之中,并且处于活跃状态。
stateFlow 与LiveData 非常相似。
我们点击界面中的加减,数据就发生相应的变化。
先看界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="0"
android:textSize="30sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_plus"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="+"
android:textSize="30sp" />
<Button
android:id="@+id/btn_minus"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="-"
android:textSize="30sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
viewModel
值得改变放到ViewModel里面
package com.dongnaoedu.flowpractice.viewmodel
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
/**
*
* @author ningchuanqi
* @version V1.0
*/
class NumberViewModel : ViewModel() {
//0是初始值
val number = MutableStateFlow(0)
fun increment() {
number.value++
}
fun decrement() {
number.value--
}
}
Fragment
package com.dongnaoedu.flowpractice.fragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.dongnaoedu.flowpractice.R
import com.dongnaoedu.flowpractice.databinding.FragmentArticleBinding
import com.dongnaoedu.flowpractice.databinding.FragmentNumberBinding
import com.dongnaoedu.flowpractice.viewmodel.ArticleViewModel
import com.dongnaoedu.flowpractice.viewmodel.NumberViewModel
import kotlinx.coroutines.flow.collect
class NumberFragment : Fragment() {
private val viewModel by viewModels<NumberViewModel>()
private val mBinding: FragmentNumberBinding by lazy {
FragmentNumberBinding.inflate(layoutInflater)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return mBinding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//给两个按钮设置监听
mBinding.apply {
btnPlus.setOnClickListener {
viewModel.increment()
}
btnMinus.setOnClickListener {
viewModel.decrement()
}
}
lifecycleScope.launchWhenCreated {
//
viewModel.number.collect { value ->
mBinding.tvNumber.text = "$value"
}
}
}
}