Stateflow/Leblivedata, der nach dem Rückdrücken nicht aktualisiert wirdAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Stateflow/Leblivedata, der nach dem Rückdrücken nicht aktualisiert wird

Post by Anonymous »

Ich habe ein Problem mit dem Datenfluss in meiner Anwendung. Repository -Klasse Um dies zu tun. EM> Back Press/Geste zurück in Fragment A, Fragment A zeigt weiterhin den Zustand der Daten, die vor der anfänglichen Navigation und der Datenveränderung vorhanden waren. Ich sollte das hinzufügen, wenn ich explizit zurück in das vorherige Fragment navigiere, funktioniert alles. Es ist speziell die Rückaktion, die nicht so wirkt, wie ich es sonst erwartet hätte. Dieses Repository verwendet einen Kotlin SharedFlow , um mit den ViewModels des jeweiligen Fragments zu kommunizieren, und dann die ViewModel -Tunnel der angegebenen Daten unter Verwendung Livedata in das Fragment. . < /p>

Code: Select all

@AndroidEntryPoint
class FragmentA : Fragment() {

private val viewModel: ViewModelA by viewModels()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = FragmentBinding.inflate(layoutInflater, container, false)
viewModel.state.observe(viewLifecycleOwner) {
it?.let {
binding.fragmentInt.text = it.toString()
}
}
binding.fragmentInt.setOnClickListener {
findNavController().navigate(
FragmentADirections.actionFragmentAToFragmentB()
)
}
return binding.root
}
}

@HiltViewModel
class ViewModelA @Inject constructor(
private val intRepository: IntRepository
) : ViewModel() {

private val _state: MutableLiveData = MutableLiveData(null)
val state: LiveData = _state

init {
viewModelScope.launch {
intRepository.observeScreenState().collect {
_state.value = it
}
}
intRepository.updateScreenState(1)
}
}

@AndroidEntryPoint
class FragmentB : Fragment(R.layout.fragment) {

private val viewModel: ViewModelB by viewModels()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentBinding.inflate(layoutInflater, container, false)
viewModel.state.observe(viewLifecycleOwner) {
it?.let {
binding.fragmentInt.text = it.toString()
}
return binding.root
}
}

@HiltViewModel
class ViewModelB @Inject constructor(
private val intRepository: IntRepository
) : ViewModel() {

private val _state: MutableLiveData = MutableLiveData(null)
val state: LiveData = _state

init {
viewModelScope.launch {
intRepository.observeScreenState().collect {
_state.value = it
}
}
intRepository.updateScreenState(6)
}
}

class IntRepository @Inject constructor() {

private val screenStateFlow = MutableStateFlow(null)

fun observeScreenState(): Flow = screenStateFlow.asStateFlow()

fun updateScreenState(value: Int) {
screenStateFlow.value = value
}
}
Update: Nach umfangreichen Tests und der Unterstützung einer Dummy -App habe ich festgestellt, dass das Problem die Verwendung der Griffbibliothek zu sein scheint. Ohne sie funktionieren meine Ströme genau so, wie ich es erwarten würde, aber es scheint, dass die Hinzufügung der DI -Bibliothek die ViewModelsCope daran hindert, die Daten zu sammeln, die beobachtet werden sollen. Ich habe den Code aktualisiert, um den Status der Dummy -App widerzuspiegeln, die mich zu dieser Schlussfolgerung führt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post