Развлечение с потоками, получение 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
}
Другие вопросы по тегам