Каков единственный источник истины в моем фрагменте с видовой моделью?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Каков единственный источник истины в моем фрагменте с видовой моделью?

Сообщение Anonymous »

У меня есть фрагмент , который содержит несколько флажков es:

Код: Выделить всё

class TestFragment : Fragment() {

private lateinit var checkBox2er: CheckBox
private lateinit var checkBox3er: CheckBox
// ...
private lateinit var checkBox10er: CheckBox

private val activityViewModel: MainViewModel by activityViewModels()

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment_test, container, false)

checkBox2er = rootView.findViewById(R.id.checkbox2TT)
checkBox3er = rootView.findViewById(R.id.checkbox3TT)
// ...
checkBox10er = rootView.findViewById(R.id.checkbox10TT)

val checkBoxes = listOf(
checkBox2er, checkBox3er, checkBox4er, checkBox5er,
checkBox6er, checkBox7er, checkBox8er, checkBox9er, checkBox10er
)

// update CheckBox from ViewModel
// IS THIS ACTUALLY NEEDED?
lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
activityViewModel.testFactors.collect { updatedFactors: Set ->
Log.d(javaClass.simpleName, "testFactors was updated")
checkBoxes.forEach { checkBox ->
checkBox.tagNumber?.let { rowId -> checkBox.isChecked = updatedFactors.contains(rowId) }
}
}
}
}

// update ViewModel Set when a CheckBox is clicked
checkBoxes.forEach { checkBox ->
checkBox.setOnCheckedChangeListener { clickedCheckBox, isChecked ->
clickedCheckBox.tagNumber?.let { rowId ->
Log.d(javaClass.simpleName, "clicked CheckBox $rowId")
activityViewModel.toggleCheckbox(rowId, isChecked)
}
}
}

return rootView
}
}

val View.tagNumber: Int?
get() {
val stringTag = this.tag as? String
return stringTag?.toIntOrNull()
}
макет флажка выглядит так: Я управляю набором из всех выбранных в настоящее время флажок es в моем ViewModel :

Код: Выделить всё

class MainViewModel(application: Application) : AndroidViewModel(application) {

private val writableTestFactors: MutableStateFlow = MutableStateFlow(sortedSetOf(2,3,4,5,6,7,8,9,10))
val testFactors: StateFlow = writableTestFactors

fun toggleCheckbox(toggleRow: Int, isChecked: Boolean) {
val newSortedSet = TreeSet(testFactors.value)
if (isChecked) {
newSortedSet.add(toggleRow)
} else {
newSortedSet.remove(toggleRow)
}
writableTestFactors.value = newSortedSet
}
}
Я теперь запутался, действительно ли нужен LifeCyclescope.launch {} . ViewModel должна быть единственным источником истины в MVVM в соответствии с моим пониманием, но кажется, что фрагмент хранит и восстанавливает проверенное состояние флажки , когда процесс подачи заявки убит.
Каким должен быть единственный источник истины здесь, и как бы я правильно реализовал подход MVVM? < /p>

Подробнее здесь: https://stackoverflow.com/questions/793 ... -viewmodel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»