流的乐趣,转换为实时数据时为空
Fun with flows, getting null when converting to live data
我正在尝试流程并尝试查看如何使用 android 视图模型将它们转换为 mvvm。这是我首先尝试测试的内容:
class HomeViewModel : ViewModel() {
private lateinit var glucoseFlow: LiveData<Int>
var _glucoseFlow = MutableLiveData<Int>()
fun getGlucoseFlow() {
glucoseFlow = flowOf(1,2).asLiveData()
_glucoseFlow.value = glucoseFlow.value
}
}
class HomeFragment : Fragment() {
private lateinit var viewModel: HomeViewModel
override fun onCreateView (
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.home_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
viewModel._glucoseFlow.observe(this, Observer {
handleUpdate(it)
})
viewModel.getGlucoseFlow()
}
private fun handleUpdate(reading : Int) {
glucose_reading.text = reading.toString()
}
}
我的阅读数为空,但有什么想法吗?
发生这种情况是因为您试图将 glucoseFlow.value
直接分配给 _glucoseFlow.value
,我想您应该使用 MediatorLiveData<Int>
,但这不是我的最终建议。
收集流量项,然后赋值给你的私有变量就可以解决
// For private variables, prefer use underscore prefix, as well MutableLiveData for assignable values.
private val _glucoseFlow = MutableLiveData<Int>()
// For public variables, prefer use LiveData just to read values.
val glucoseFlow: LiveData<Int> get() = _glucoseFlow
fun getGlucoseFlow() {
viewModelScope.launch {
flowOf(1, 2)
.collect {
_glucoseFlow.value = it
}
}
}
在 HomeViewModel
上进行之前的实施,开始从 HomeFragment
观察您的 public glucoseFlow
并且您将能够接收非空序列值( 1 然后 2).
如果您正在使用数据绑定,请不要忘记将片段视图指定为绑定的生命周期所有者以便绑定可以观察 LiveData 更新。
class HomeFragment : Fragment() {
...
binding.lifecycleOwner = viewLifecycleOwner
}
我正在尝试流程并尝试查看如何使用 android 视图模型将它们转换为 mvvm。这是我首先尝试测试的内容:
class HomeViewModel : ViewModel() {
private lateinit var glucoseFlow: LiveData<Int>
var _glucoseFlow = MutableLiveData<Int>()
fun getGlucoseFlow() {
glucoseFlow = flowOf(1,2).asLiveData()
_glucoseFlow.value = glucoseFlow.value
}
}
class HomeFragment : Fragment() {
private lateinit var viewModel: HomeViewModel
override fun onCreateView (
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.home_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
viewModel._glucoseFlow.observe(this, Observer {
handleUpdate(it)
})
viewModel.getGlucoseFlow()
}
private fun handleUpdate(reading : Int) {
glucose_reading.text = reading.toString()
}
}
我的阅读数为空,但有什么想法吗?
发生这种情况是因为您试图将 glucoseFlow.value
直接分配给 _glucoseFlow.value
,我想您应该使用 MediatorLiveData<Int>
,但这不是我的最终建议。
收集流量项,然后赋值给你的私有变量就可以解决
// For private variables, prefer use underscore prefix, as well MutableLiveData for assignable values.
private val _glucoseFlow = MutableLiveData<Int>()
// For public variables, prefer use LiveData just to read values.
val glucoseFlow: LiveData<Int> get() = _glucoseFlow
fun getGlucoseFlow() {
viewModelScope.launch {
flowOf(1, 2)
.collect {
_glucoseFlow.value = it
}
}
}
在 HomeViewModel
上进行之前的实施,开始从 HomeFragment
观察您的 public glucoseFlow
并且您将能够接收非空序列值( 1 然后 2).
如果您正在使用数据绑定,请不要忘记将片段视图指定为绑定的生命周期所有者以便绑定可以观察 LiveData 更新。
class HomeFragment : Fragment() {
...
binding.lifecycleOwner = viewLifecycleOwner
}