From e7e61cd9ab8b882ccb99325960e2b6677b972548 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 9 Dec 2021 18:50:53 +0900 Subject: [PATCH] Fix potential crash due to children being mutated after disposal This is a bit of an unfortunate edge case where the unbind-on-disposal doesn't help, since the binding is happening in BDL, and the usage is in a nested `LoadComponentAsync` call. Combine those and you have a recipe for disaster. --- osu.Game/Screens/Select/BeatmapInfoWedge.cs | 25 ++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs index e4cf9bd868..d292b7114f 100644 --- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs +++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs @@ -330,6 +330,21 @@ namespace osu.Game.Screens.Select addInfoLabels(); } + protected override void LoadComplete() + { + base.LoadComplete(); + + mods.BindValueChanged(m => + { + settingChangeTracker?.Dispose(); + + refreshBPMLabel(); + + settingChangeTracker = new ModSettingChangeTracker(m.NewValue); + settingChangeTracker.SettingChanged += _ => refreshBPMLabel(); + }, true); + } + private void setMetadata(string source) { ArtistLabel.Text = artistBinding.Value; @@ -360,16 +375,6 @@ namespace osu.Game.Screens.Select Children = getRulesetInfoLabels() } }; - - mods.BindValueChanged(m => - { - settingChangeTracker?.Dispose(); - - refreshBPMLabel(); - - settingChangeTracker = new ModSettingChangeTracker(m.NewValue); - settingChangeTracker.SettingChanged += _ => refreshBPMLabel(); - }, true); } private InfoLabel[] getRulesetInfoLabels()