Flutter GetX嵌套Obx使用疑问:为何需二次包裹GestureDetector?
为什么必须嵌套第二个Obx才能更新列表项UI
核心原因:GetX的Obx仅监听自身作用域内访问的Observable变量
外层Obx的监听范围有限
外层Obx只负责监听pagesController.isLoading和pagesController.pagesModel.length这几个直接在它内部访问的Observable变量。当点击列表项修改选中状态时,这些变量并未发生变化,因此外层Obx不会触发整个列表的重建。列表项选中状态依赖未被外层监听的Observable
每个列表项的opacity由pagesController.isCurrentPageSelected(page.id)的返回值决定,这个方法内部必然访问了保存选中ID的Observable List(比如selectedPages)。而这个Observable变量不在外层Obx的监听范围内,所以外层Obx感知不到它的变化。内层Obx负责监听单个列表项的状态变化
嵌套的第二个Obx包裹了单个列表项的UI逻辑,它内部直接调用isCurrentPageSelected方法(间接访问了选中状态的Observable变量)。当选中状态改变时,这个内层Obx会触发自身重建,从而更新当前项的opacity,实现选中后的视觉反馈。
如果去掉内层Obx,列表项的UI属于外层Obx的一部分,但外层Obx没有监听选中状态的Observable变量,所以即使控制器里的选中状态已经更新,UI也不会收到重建通知,自然看不到变化——这就是你遇到的问题。
内容的提问来源于stack exchange,提问作者Chandler Bing
相关产品推荐
相关产品推荐

