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

