首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量“wordlist”必须在kotlin中初始化错误

变量“wordlist”必须在kotlin中初始化错误
EN

Stack Overflow用户
提问于 2022-10-27 12:58:44
回答 2查看 34关注 0票数 -1

我试图用kotlin中的jsoap从互联网上获取数据。我从互联网上获取数据,我想把它分配给一个属性,我声明它可以轻松地再次使用,但我得到了这个错误。我知道这是非常简单的错误,但我想学习issiue的基础。首先,我声明了一个属性,并将它分配给范围内的internet数据,但当我想在范围之外使用它时,它就会产生这个错误。但我不明白的是,我已经将来自互联网的数据分配给了这个变量,为什么它要再次初始化这个变量?当我这样定义它时,

代码语言:javascript
复制
var wordList : MutableList<ExtractedData>?=null 

错误消失了,但是在控制台中,范围外的数据是空的或为空的。但是,我所做的scop中的数据继续正确地出现,没有问题了。

我的代码

代码语言:javascript
复制
@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)


}

我的错误

代码语言:javascript
复制
Variable 'wordList' must be initialized
EN

回答 2

Stack Overflow用户

发布于 2022-10-27 13:15:21

除非变量已经被初始化,否则不能使用它。让我们来看看你的功能身体:

代码语言:javascript
复制
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肯定已经初始化了,因为您在这个块中为它分配了一些语句,上面只有几条语句。

代码语言:javascript
复制
})

现在您已经在块之外了,此时编译器不知道分配给wordList的上述块是否已经执行。如果它没有被执行,wordList将不会被初始化。

代码语言:javascript
复制
println(wordList)//-->but here it wants to be initialized again

因此,您将得到此错误。它不“想再次初始化”--它可能没有初始化过一次。

代码语言:javascript
复制
MostUsedWordItem(wordArray = wordList)

在这里,wordList仍然是在没有被初始化的情况下使用的。

我刚刚给了你错误信息的原因。你的问题的解决办法是通过藤四对你的问题的评论。

票数 0
EN

Stack Overflow用户

发布于 2022-10-27 13:59:01

必须对LiveData作出反应。将在观察者中接收到的值复制到观察者作用域之外的局部变量中是没有意义的,因为在所有其他代码都已经使用了局部变量及其初始值之后,将调用观察者。

但是,由于您使用的是撰写,您可以使用状态处理LiveData就像一个变量。然后,当新值到达时,它将触发重新组合。这实际上类似于将所有代码放入观察者块中的方式,但您可以调用其他可组合的代码,而且它要干净得多,特别是如果有多个LiveData要处理的话。使用observeAsState()作为变量委托执行以下操作:

代码语言:javascript
复制
@Composable
fun MostUsedWordScreen(viewModel: MostUsedWordScreenViewModel = hiltViewModel()) {

    val wordList: List<ExtractedData> by viewModel.fetchData().observeAsState()

    MostUsedWordItem(wordArray = wordList)

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74222455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档