使用 Mutablelivedata 从 DialogFragment ColorPicker 更改片段的背景颜色不起作用

Change background color of a Fragment from DialogFragment ColorPicker using Mutablelivedata not working

我的应用程序应该能够从拾色器(即 DialogFragment)的片段(称为颜色预览)中更改屏幕的一部分的颜色,并在单击按钮后显示。我在 Fragment 和 DialogFragment 中使用了带有 MutableLiveData 的相同 ViewModel。但是,当我在 DialogFragment 中选择一些颜色时,我无法在 Fragment 中获取有关颜色的数据。下面的代码。

对话片段:

class ColorFragment : DialogFragment() {

private var _binding: FragmentColorBinding? = null
private val binding get() = _binding!!

private val viewModel: MainViewModel by lazy {
    getViewModel {
        MainViewModel()
    }
}

@SuppressLint("DialogFragmentInsteadOfSimpleDialog")
override fun onStart() {
    super.onStart()  
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    FragmentColorBinding.inflate(inflater, container, false).apply {
        _binding = this
        lifecycleOwner = this@ColorFragment
        mainViewModel = getViewModel()

        return root
    }
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    binding.color02.setOnClickListener { 
        viewModel.currentLightProfileColor.value = "#00ffff"
    }
}

主要片段(应显示颜色的地方)如下所示:

class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!
private var viewCreated = false

private val viewModel: MainViewModel by lazy {
    getViewModel {
        MainViewModel()
    }
}


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    FragmentMainBinding.inflate(inflater, container, false).apply {
        _binding = this
        lifecycleOwner = this@MainFragment
        mainViewModel = getViewModel()
        executePendingBindings()

        viewCreated = true

        return root
    }
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        binding.colorPreview.holder?.addCallback(this)
       
        viewModel.currentLightProfileColor.observe(viewLifecycleOwner) { color ->
            Color.parseColor(color.toString()).let { color ->
                Timber.d("color LiveDataGet: ${color}")
                binding.colorPreview.setBackgroundColor(color)
                }
            }
      
    binding.color.setOnClickListener {
        findNavController().navigate(R.id.ColorFragment)
    }
}

在我的 ViewModel 中只有颜色的 MutableLiveData:

class MainViewModel : ViewModel() {
val currentLightProfileColor = MutableLiveData<String>()}

我没有收到任何错误,但是一旦我点击 color2,我应该从日志中的 Timber 获取:“color LiveDataGet: #00ffff”,但我没有收到,而且颜色预览不会改变颜色。

我错过了什么吗? 如果有人可以快速查看我的代码,我将不胜感激。谢谢!

我找到了解决办法。在 Kotlin 中,如果在没有 activityViewModels() 的情况下实例化 viewModels(),则不会共享数据。 所以我改变了我的代码,而不是:

private val viewModel: MainViewModel by lazy {
    getViewModel {
        LightmvpViewModel()
    }
}

我写了:

private val viewModel: MainViewModel by activityViewModels()

通过这个简单的更改,一切都应该正常。