'view model load null in first time using with bottom navigation view
so i have App in MVVM architecture and that have a bottom navigation view that has three fragments and i will navigation between them by navigation component , but in first inter to fragments views value not been set , but when i reopen the fragment every thing is fine.
MainActivity
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val bottomNavBar= binding.bottomNavigationView
val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
navController =navHostFragment.findNavController()
bottomNavBar.setupWithNavController(navController)
}
}
SettingFragment
private const val TAG = "SettingsFragment"
@AndroidEntryPoint
class SettingsFragment : Fragment() {
private val viewModel : SettingfragmnetVModel by viewModels()
private lateinit var binding : FragmentSettingsBinding
override fun onCreateView(
inflater : LayoutInflater , container : ViewGroup? ,
savedInstanceState : Bundle?
) : View? {
binding = FragmentSettingsBinding.inflate(inflater , container , false)
binding.lifecycleOwner = this.viewLifecycleOwner
binding.viewModel = viewModel
viewModel
setValues()
binding.toggleNight.setOnSelectListener {
viewModel.updateNightMode()
}
binding.toggleVibration.setOnSelectListener {
viewModel.updateVibration()
}
binding.toggleSound.setOnSelectListener {
viewModel.updateSound()
}
return binding.root
}
private fun setValues() {
if (viewModel.settings.value?.nightMode == true) {
binding.toggleNight.selectButton(binding.btnNight)
}
if (viewModel.settings.value?.vibration == true)
binding.toggleVibration.selectButton(binding.btnVibration)
if (viewModel.settings.value?.soundEffect == true)
binding.toggleSound.selectButton(binding.btnSound)
Log.i(TAG , "onCreateView: ${viewModel.settings.value}")
}
}
SettingFragmentViewModel
@HiltViewModel
class SettingfragmnetVModel @Inject constructor(
private val preference : PreferenceManger
) : ViewModel() {
private var _settings = MutableLiveData<FilterPreferences>()
val settings : LiveData<FilterPreferences>
get() = _settings
init {
getSettings()
}
private fun getSettings() {
viewModelScope.launch {
getSetting()
}
}
fun updateNightMode() {
viewModelScope.launch {
preference.updateNightMode(!_settings.value?.nightMode!!)
getSetting()
}
}
fun updateVibration() {
viewModelScope.launch {
preference.updateVibration(!_settings.value?.vibration!!)
getSetting()
}
}
fun updateSound() {
viewModelScope.launch {
preference.updateSound(!_settings.value?.soundEffect!!)
getSetting()
}
}
private suspend fun getSetting() {
withContext(
Dispatchers.IO
) {
preference.preferences.collect {
_settings.postValue(it)
}
}
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|