Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit d07b009

Browse files
authored
Fix LocalizedString gets unsubscribed while still in use (#987)
* Fixed all the things * Make PersistentObservableObject abstract * Reverse the inheritance * Commit to rerun tests * Remove PersistentObservableObject * Grammar
1 parent e976b79 commit d07b009

File tree

4 files changed

+23
-4
lines changed

4 files changed

+23
-4
lines changed

src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizedStringTests/LocalizedStringTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,23 @@ public void LocalizedStringTests_ImplicitConversion_ValidImplementation()
6161
Assert.NotNull(localizedString);
6262
}
6363

64+
[Fact]
65+
public void LocalizedStringTests_WeekSubscribe_ValidImplementation()
66+
{
67+
// Arrange
68+
var isTrigered = false;
69+
var culture2 = new CultureInfo("en");
70+
localizedString = new LocalizedString(localizationManager, () => string.Empty);
71+
localizedString.PropertyChanged += (_, __) => isTrigered = true;
72+
73+
// Act
74+
GC.Collect();
75+
localizationManager.CurrentCulture = culture2;
76+
77+
// Assert
78+
Assert.True(isTrigered);
79+
}
80+
6481
[Fact]
6582
public void LocalizedStringTests_Disposed_IfNoReferences()
6683
{

src/CommunityToolkit/Xamarin.CommunityToolkit/Helpers/LocalizationResourceManager.shared.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void Init(ResourceManager resource) =>
2929
public void Init(ResourceManager resource, CultureInfo initialCulture)
3030
{
3131
resourceManager = resource;
32-
SetCulture(initialCulture);
32+
CurrentCulture = initialCulture;
3333
}
3434

3535
public string GetValue(string text) =>

src/CommunityToolkit/Xamarin.CommunityToolkit/Helpers/LocalizedString.shared.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using Xamarin.CommunityToolkit.ObjectModel;
3-
using Xamarin.CommunityToolkit.ObjectModel.Extensions;
43
using Xamarin.Forms.Internals;
54

65
namespace Xamarin.CommunityToolkit.Helpers
@@ -18,7 +17,10 @@ public LocalizedString(Func<string> generator = null)
1817
public LocalizedString(LocalizationResourceManager localizationManager, Func<string> generator = null)
1918
{
2019
this.generator = generator;
21-
localizationManager.WeakSubscribe(this, (t, sender, e) => t.OnPropertyChanged(null));
20+
21+
// This instance will be unsubscribed and GCed if no one references it
22+
// since LocalizationResourceManager uses WeekEventManger
23+
localizationManager.PropertyChanged += (sender, e) => OnPropertyChanged(null);
2224
}
2325

2426
public string Localized => generator?.Invoke();

src/CommunityToolkit/Xamarin.CommunityToolkit/ObjectModel/ObservableObject.shared.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace Xamarin.CommunityToolkit.ObjectModel
1010
{
1111
/// <summary>
12-
/// Observable object with INotifyPropertyChanged implemented
12+
/// Observable object with INotifyPropertyChanged implemented using WeakEventManager
1313
/// </summary>
1414
public abstract class ObservableObject : INotifyPropertyChanged
1515
{

0 commit comments

Comments
 (0)