Развлечение с потоками, получение null при преобразовании в живые данные
Я пробую потоки и пытаюсь понять, как их можно преобразовать в mvvm с моделями представления Android. Вот что я сначала попробовал проверить:
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()
}
}
Я получаю ноль для числа чтения, но есть идеи?
2 ответа
Это происходит потому, что вы пытаетесь назначить 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
, начни наблюдать за своей публикой glucoseFlow
от HomeFragment
и вы сможете получать значения ненулевой последовательности (1, а затем 2).
Если вы используете привязку данных, не забудьте указать представление фрагмента в качестве владельца жизненного цикла привязки , чтобы привязка могла отслеживать обновления LiveData.
class HomeFragment : Fragment() {
...
binding.lifecycleOwner = viewLifecycleOwner
}