为什么Flutter中调用setState后内部变量不会立即更新?
原理说明
首先明确Flutter里setState的执行逻辑:传入的回调函数本身是同步执行的,框架会先执行你传入的回调,再标记组件需要重绘。
你第一个示例里第二次打印仍得到null,大概率是你实际代码中给setState传入的回调加了async关键字,这种情况下回调内的赋值操作会进入异步队列,晚于同步执行的print("Second: $data"),所以打印时拿到的还是未修改的旧值。
第二个示例你把赋值操作放在了setState之外的同步流程里,所以打印时自然能拿到修改后的值1。
空回调写法的合法性
你最后给出的写法完全可以正常运行。
官方推荐把状态修改逻辑放在setState回调内,只是代码规范层面的约定:一是让状态变更的逻辑更集中,后续维护时一眼就能知道哪些操作会触发UI更新;二是避免出现修改完状态忘记调用setState,导致UI没有对应更新的低级错误。
从功能实现角度看,只要你在修改状态之后调用setState,哪怕回调是空的,都能正常触发UI重绘,和把修改逻辑写在回调里没有任何区别。
内容的提问来源于stack exchange,提问作者Chen Li Yong
相关产品推荐
相关产品推荐

