我试图用kotlin中的jsoap从互联网上获取数据。我从互联网上获取数据,我想把它分配给一个属性,我声明它可以轻松地再次使用,但我得到了这个错误。我知道这是非常简单的错误,但我想学习issiue的基础。首先,我声明了一个属性,并将它分配给范围内的internet数据,但当我想在范围之外使用它时,它就会产生这个错误。但我不明白的是,我已经将来自互联网的数据分配给了这个变量,为什么它要再次初始化这个变量?当我这样定义它时,
var wordList : MutableList<ExtractedData>?=null 错误消失了,但是在控制台中,范围外的数据是空的或为空的。但是,我所做的scop中的数据继续正确地出现,没有问题了。
我的代码
@Composable
fun MostUsedWordScreen(viewModel: MostUsedWordScreenViewModel = hiltViewModel()) {
var wordList : MutableList<ExtractedData>
viewModel.fetchData().observe(LocalLifecycleOwner.current, Observer {
wordList = it
println("inside wordlist"+wordList)
})
println("outside wordlist"+wordList)
MostUsedWordItem(wordArray = wordList)
}我的错误
Variable 'wordList' must be initialized发布于 2022-10-27 13:15:21
除非变量已经被初始化,否则不能使用它。让我们来看看你的功能身体:
var wordList : MutableList<ExtractedData>
viewModel.fetchData().observe(LocalLifecycleOwner.current, Observer {
wordList = it
println(wordList) //-->here it shows data from internet there is no problem此时,编译器知道wordList肯定已经初始化了,因为您在这个块中为它分配了一些语句,上面只有几条语句。
})现在您已经在块之外了,此时编译器不知道分配给wordList的上述块是否已经执行。如果它没有被执行,wordList将不会被初始化。
println(wordList)//-->but here it wants to be initialized again因此,您将得到此错误。它不“想再次初始化”--它可能没有初始化过一次。
MostUsedWordItem(wordArray = wordList)在这里,wordList仍然是在没有被初始化的情况下使用的。
我刚刚给了你错误信息的原因。你的问题的解决办法是通过藤四对你的问题的评论。
发布于 2022-10-27 13:59:01
必须对LiveData作出反应。将在观察者中接收到的值复制到观察者作用域之外的局部变量中是没有意义的,因为在所有其他代码都已经使用了局部变量及其初始值之后,将调用观察者。
但是,由于您使用的是撰写,您可以使用状态处理LiveData就像一个变量。然后,当新值到达时,它将触发重新组合。这实际上类似于将所有代码放入观察者块中的方式,但您可以调用其他可组合的代码,而且它要干净得多,特别是如果有多个LiveData要处理的话。使用observeAsState()作为变量委托执行以下操作:
@Composable
fun MostUsedWordScreen(viewModel: MostUsedWordScreenViewModel = hiltViewModel()) {
val wordList: List<ExtractedData> by viewModel.fetchData().observeAsState()
MostUsedWordItem(wordArray = wordList)
}https://stackoverflow.com/questions/74222455
复制相似问题