首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用函数写到撰写中的局部变量时,我可以得到正确的结果?

为什么在使用函数写到撰写中的局部变量时,我可以得到正确的结果?
EN

Stack Overflow用户
提问于 2021-10-06 09:26:49
回答 1查看 64关注 0票数 0

代码A是基于文章的。

我被告知,如果函数写入局部变量,这段代码将不是线程安全的或正确的,我将得到错误的结果。

他说:我用代码A测试它,但我总是得到正确的结果,为什么?

2: B码正确吗?

码A

代码语言:javascript
复制
@Composable
fun ListWithBug(myList: List<String>) {
    var items = 0

    Row(horizontalArrangement = Arrangement.SpaceBetween) {
        Column {
            for (item in myList) {
                Text("Item: $item")
                items++ // Avoid! Side-effect of the column recomposing.
            }
        }
        Text("Count: $items")
    }
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApp {
                ListWithBug(mutableListOf("a","b","c","d","e","f","g","h","k","j"))
            }
        }
    }
}

码B

代码语言:javascript
复制
@Composable
fun ListWithBug(myList: List<String>) {
    var items by remember { mutableStateOf(0) }

    Row(horizontalArrangement = Arrangement.SpaceBetween) {
        Column {
            for (item in myList) {
                Text("Item: $item")
                items++ // Avoid! Side-effect of the column recomposing.
            }
        }
        Text("Count: $items")
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-06 09:34:59

在实际情况下,它将不像预期的那样工作。它可能对您有用,因为您正在隔离地测试它。每当可组合重新组合时,它将重新初始化在其中声明的所有变量。因此,如果s=triggers是可组合变量的重新组合,它将将items变量重新初始化为0.我说它不会在实际应用程序中工作,因为在那个地方,有一个用户正在与之交互的可组合性池。按下按钮可能会导致多个重新组合,因此在本地可组合的情况下维护此状态是不安全的。

第二种方法可能很好,但根本不推荐,因为它会导致其他可组合性之间的状态不一致,因为理想情况下,您应该将所有UI状态存储在viewmodel中。它是真理的单一来源,所有的合成材料都可以从一个地方这样解读状态。

您可以学习状态提升,以便使用与撰写一致的视图模型。只要看看这码标

也许是专门的页面,但肯定会给出一个整体的代码。

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

https://stackoverflow.com/questions/69463101

复制
相关文章

相似问题

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