我有一个
ROOM
数据库,我从中获取值。
我正在使用
Observer
来获取数据,但是有一个问题。我的 availability
中有一个全局变量 Fragment
,我想将值存储在其中,因为我需要在代码的许多部分使用这个变量。然而,Observer
,出于某种原因,没有将任何数据存储到这个变量中。
代码:
private var availability = 0
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentCoursesBinding.inflate(inflater, container, false)
viewModel.availability.observe(viewLifecycleOwner) {
availability = it
}
return binding.root
}
我之所以需要这样一个全局变量,正如我前面所说,是为了在代码的其他部分使用它,因为其他UI元素的状态依赖于它,这也依赖于其他
Observers
.
怎么会这样?
答案有两种形式
回答 1/2,如果您使用 Jetpack Compose 构建您的应用程序,这将可以只在一行中执行此操作:
private val availability = 0
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentCoursesBinding.inflate(inflater, container, false)
//this single line
availability = viewModel.availability.collectAsState(initial=0).value
return binding.root
}
回答 2/2 当你没有使用 compose 时,你只能选择在花括号中的上下文中工作
viewModel.availability.observe(viewLifecycleOwner) {
availability = it
//TODO: in only this context.... Call all
//Functions, objects, Variables, classes that you want to use the up-to-date value of availability from here
}
该上下文之外的值将不会获取最新数据,因为编译器将根据上下文分配值