使用 android 和 Kotlin 的 ViewModel:无法可视化价值
ViewModel with android and Kotlin: can't visualize value
我有我的片段主页视图模型,我想在这个视图模型中设置一个变量,以便将它传递到另一个片段中。我已经完成了视图模型的所有工作,但是当我启动我的模拟器时,应用程序没有显示任何内容...
HomeViewModel:
class HomeViewModel: ViewModel() {
val text = MutableLiveData<String>()
fun setText(string: String) {
text.value = string
}
}
主页片段(我在其中设置变量的值):
private var valueFromHome = "ABCDEFG"
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// API CALL
binding.buttonHomeFragmentApiCall.setOnClickListener {
this.context?.let { getRandomComputerDetails(it, myResultListener) }
// SET OF VALUE FOR VARIABLE IN VIEW MODEL
homeViewModel = ViewModelProvider(requireActivity()).get(HomeViewModel::class.java)
homeViewModel.setText(valueFromHome)
}
}
信息片段(我从视图模型中读取的地方):
class InfoFragment : Fragment() {
private var _binding: FragmentInfoBinding? = null
private lateinit var binding: FragmentInfoBinding
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentInfoBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// I READ HERE FROM VIEW MODEL
homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
homeViewModel.text.observe(viewLifecycleOwner, Observer {
binding.infoFragmentTextView.text = it
})
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
因此,在我设置文本的信息片段中,恰好 binding.infoFragmentTextView.text = it
一旦我启动模拟器,没有显示任何实际内容(相反,我期待片段中有一个字符串 (ABCDEFG)。为什么?
您为每个视图模型使用了不同的范围。一个范围正确地限定为 activity,另一个范围限定为您的片段。
如果你想引用相同的视图模型,你需要在这两种情况下使用 ViewModelProvider(requireActivity())
。
我有我的片段主页视图模型,我想在这个视图模型中设置一个变量,以便将它传递到另一个片段中。我已经完成了视图模型的所有工作,但是当我启动我的模拟器时,应用程序没有显示任何内容...
HomeViewModel:
class HomeViewModel: ViewModel() {
val text = MutableLiveData<String>()
fun setText(string: String) {
text.value = string
}
}
主页片段(我在其中设置变量的值):
private var valueFromHome = "ABCDEFG"
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// API CALL
binding.buttonHomeFragmentApiCall.setOnClickListener {
this.context?.let { getRandomComputerDetails(it, myResultListener) }
// SET OF VALUE FOR VARIABLE IN VIEW MODEL
homeViewModel = ViewModelProvider(requireActivity()).get(HomeViewModel::class.java)
homeViewModel.setText(valueFromHome)
}
}
信息片段(我从视图模型中读取的地方):
class InfoFragment : Fragment() {
private var _binding: FragmentInfoBinding? = null
private lateinit var binding: FragmentInfoBinding
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentInfoBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// I READ HERE FROM VIEW MODEL
homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
homeViewModel.text.observe(viewLifecycleOwner, Observer {
binding.infoFragmentTextView.text = it
})
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
因此,在我设置文本的信息片段中,恰好 binding.infoFragmentTextView.text = it
一旦我启动模拟器,没有显示任何实际内容(相反,我期待片段中有一个字符串 (ABCDEFG)。为什么?
您为每个视图模型使用了不同的范围。一个范围正确地限定为 activity,另一个范围限定为您的片段。
如果你想引用相同的视图模型,你需要在这两种情况下使用 ViewModelProvider(requireActivity())
。