Skip to content

Commit 9802ce2

Browse files
committed
Fix: context copy
1 parent c48af56 commit 9802ce2

2 files changed

Lines changed: 17 additions & 11 deletions

File tree

src/NavStack/Assets/NavStack/Runtime/NavigationStackCore.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@ internal sealed class NavigationStackCore
1919

2020
bool isRunning;
2121

22-
public async UniTask PopAsync(NavigationContext context, CancellationToken cancellationToken = default)
22+
public async UniTask PopAsync(INavigation navigation, NavigationContext context, CancellationToken cancellationToken = default)
2323
{
24+
var copiedContext = context.CreateCopy();
25+
copiedContext.Options = context.Options ?? navigation.DefaultOptions;
26+
2427
if (isRunning)
2528
{
26-
switch (context.Options.AwaitOperation)
29+
switch (copiedContext.Options.AwaitOperation)
2730
{
2831
case NavigationAwaitOperation.Error:
2932
throw new InvalidOperationException("Navigation is currently in transition.");
@@ -43,10 +46,10 @@ public async UniTask PopAsync(NavigationContext context, CancellationToken cance
4346
pageStack.TryPop(out var page);
4447
pageStack.TryPeek(out activePage);
4548

46-
var task1 = NavigationHelper.InvokeOnDisappear(page, callbackReceivers, context, cancellationToken);
49+
var task1 = NavigationHelper.InvokeOnDisappear(page, callbackReceivers, copiedContext, cancellationToken);
4750
var task2 = activePage == null
4851
? UniTask.CompletedTask
49-
: NavigationHelper.InvokeOnAppear(activePage, callbackReceivers, context, cancellationToken);
52+
: NavigationHelper.InvokeOnAppear(activePage, callbackReceivers, copiedContext, cancellationToken);
5053

5154
await UniTask.WhenAll(task1, task2);
5255

@@ -58,11 +61,14 @@ public async UniTask PopAsync(NavigationContext context, CancellationToken cance
5861
}
5962
}
6063

61-
public async UniTask PushAsync(Func<UniTask<IPage>> pageFactory, NavigationContext context, CancellationToken cancellationToken = default)
64+
public async UniTask PushAsync(INavigation navigation, Func<UniTask<IPage>> pageFactory, NavigationContext context, CancellationToken cancellationToken = default)
6265
{
66+
var copiedContext = context.CreateCopy();
67+
copiedContext.Options = context.Options ?? navigation.DefaultOptions;
68+
6369
if (isRunning)
6470
{
65-
switch (context.Options.AwaitOperation)
71+
switch (copiedContext.Options.AwaitOperation)
6672
{
6773
case NavigationAwaitOperation.Error:
6874
throw new InvalidOperationException("Navigation is currently in transition.");
@@ -83,8 +89,8 @@ public async UniTask PushAsync(Func<UniTask<IPage>> pageFactory, NavigationConte
8389

8490
var task1 = activePage == null
8591
? UniTask.CompletedTask
86-
: NavigationHelper.InvokeOnDisappear(activePage, callbackReceivers, context, cancellationToken);
87-
var task2 = NavigationHelper.InvokeOnAppear(page, callbackReceivers, context, cancellationToken);
92+
: NavigationHelper.InvokeOnDisappear(activePage, callbackReceivers, copiedContext, cancellationToken);
93+
var task2 = NavigationHelper.InvokeOnAppear(page, callbackReceivers, copiedContext, cancellationToken);
8894

8995
await UniTask.WhenAll(task1, task2);
9096

src/NavStack/Assets/NavStack/Runtime/UI/NavigationStack.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,17 @@ protected virtual void Awake()
6767

6868
public UniTask PopAsync(NavigationContext context, CancellationToken cancellationToken = default)
6969
{
70-
return core.PopAsync(context, cancellationToken);
70+
return core.PopAsync(this, context, cancellationToken);
7171
}
7272

7373
public UniTask PushAsync(IPage page, NavigationContext context, CancellationToken cancellationToken = default)
7474
{
75-
return core.PushAsync(() => new(page), context, cancellationToken);
75+
return core.PushAsync(this, () => new(page), context, cancellationToken);
7676
}
7777

7878
public UniTask PushAsync(Func<UniTask<IPage>> factory, NavigationContext context, CancellationToken cancellationToken = default)
7979
{
80-
return core.PushAsync(factory, context, cancellationToken);
80+
return core.PushAsync(this, factory, context, cancellationToken);
8181
}
8282
}
8383
}

0 commit comments

Comments
 (0)