You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avalonia 11中RxApp.SuspensionHost.GetAppState返回null问题求助

Avalonia 11中RxApp.SuspensionHost.GetAppState返回null的解决方法

在Avalonia从0.10升级到11后,ReactiveUI的AutoSuspend机制初始化逻辑发生了变化,直接调用RxApp.SuspensionHost.GetAppState<AppState>()会返回null,进而导致保存状态时NewtonsoftJsonSuspensionDriver.SaveState接收的state参数为空。以下是具体解决步骤:

问题根源

Avalonia 11版本中,AutoSuspendHelper不再自动触发状态加载流程。原0.10版本里SetupDefaultSuspendResume会自动初始化或加载AppState的逻辑被调整,必须手动触发状态加载,才能让SuspensionHost内部的AppState实例被正确初始化。

解决步骤

修改OnFrameworkInitializationCompleted方法,在完成SuspensionHost配置后,手动调用LoadStateAsync方法触发状态加载:

protected override async void OnFrameworkInitializationCompleted()
{
    ...
    var suspension = new AutoSuspendHelper(ApplicationLifetime);
    RxApp.SuspensionHost.CreateNewAppState = () => new AppState();
    RxApp.SuspensionHost.SetupDefaultSuspendResume(new NewtonsoftJsonSuspensionDriver(appStatePath));
    suspension.OnFrameworkInitializationCompleted();
    
    // 手动触发状态加载:优先加载已保存的状态,不存在则调用CreateNewAppState创建新实例
    await RxApp.SuspensionHost.LoadStateAsync();
    
    var state = RxApp.SuspensionHost.GetAppState<AppState>();
    ...
}

如果你的方法无法使用异步(不推荐此方式),可以同步等待:

RxApp.SuspensionHost.LoadStateAsync().Wait();

为什么临时创建实例没用

你之前尝试的var state = RxApp.SuspensionHost.GetAppState<AppState>() ?? new AppState();只是创建了一个独立的AppState实例,但SuspensionHost内部维护的状态实例仍然是null。保存状态时,NewtonsoftJsonSuspensionDriver.SaveState使用的是SuspensionHost内部的实例,而非你手动创建的那个,所以依然会出现参数为null的问题。必须通过LoadStateAsync让SuspensionHost自己完成实例的初始化或加载,才能让内部状态实例与后续的保存流程关联起来。

内容的提问来源于stack exchange,提问作者LosManos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:33:35