fix: preserve layout loading state across temporary overlays#60
fix: preserve layout loading state across temporary overlays#60google-labs-jules[bot] wants to merge 2 commits into
Conversation
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.
|
Closing during PR triage: this is a stale or duplicate layout-loading monotonicity attempt. #49 is the clean green candidate for this behavior; this PR is superseded, failing/conflicting, or mixed-scope and should not be merged as-is. |
Understood. Acknowledging that this work is now obsolete and stopping work on this task. |
观察到的问题
在 Daily Lifecycle Review 中发现:
ChatConversationSurfaceProjectionCoordinator没有将界面可视状态(ShouldShow...)与界面布局加载状态(ShouldLoad...,在 Uno/WinUI 中对应x:Load)解耦。临时显示阻塞遮罩或切换会话时,底层会话根和消息记录的ShouldShow会变为 false,导致同名的ShouldLoad跟着变 false,从而在 UI 层卸载整个结构,后续又需要重新挂载,违背了框架的最佳实践和加载状态的单调性(monotonicity)。根本原因
ChatConversationSurfaceProjectionCoordinator直接使用了展示状态作为加载状态,没有通过内部状态跟踪来记录“是否曾经挂载过”。只要曾经需要显示,就应该保持挂载状态。为什么架构上是安全的
我引入了两个布尔类型的本地字段
_hasLoadedActiveConversationRoot和_hasLoadedTranscriptSurface,它们只会被设为true。通过将这两个字段传给ChatConversationSurfaceProjection作为加载依据,保证了单调性。这种改动保持了单一事实源(SSOT)设计,也没有在 Code-Behind 中加入任何黑客代码,并且符合跨平台的x:Load生命周期控制最佳实践。验证命令
我执行了以下的验证步骤:
dotnet build SalmonEgg.sln --configuration Debug(发现缺少的 WebAssembly workload 后,执行了dotnet workload install wasm-tools修复编译环境)。dotnet test tests/SalmonEgg.Presentation.Core.Tests/SalmonEgg.Presentation.Core.Tests.csproj --configuration Debug --no-restoredotnet test SalmonEgg.sln --configuration Debug --no-build剩余未验证的仅限 GUI 的风险
依赖了底层依赖的 Uno 平台对于
x:Load在ShouldLoad保持true并且Visibility设为Collapsed时的开销,这需要在不同平台的实际渲染管线上做 smoke testing 才能最后确认其完全零回归。然而架构上的变化是纯正的逻辑变更,不引入任何特定于平台的变化。PR created automatically by Jules for task 14034288579553654798 started by @YoungSx