'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