C#
Xamain
PRISM

Xamarin.FormsとPrismでPageDialogService.DisplayAlertAsyncが落ちる

More than 1 year has passed since last update.

XamarinとPrismで開発しているときに OnNavigatingTo とかで↓のみたいなのコード書いてると落ちた。

public async void OnNavigatingTo(NavigationParameters parameters)
{
    await _pageDialogService.DisplayAlertAsync("確認", "aaaaaaa", "閉じる");
}

調べてみるとPrismのIssuesにあった

GitHub pageDialogService MainPage reference is always null inside OnNavigatedTo after app is launched #1098

Task.Yield()で解決

public async void OnNavigatingTo(NavigationParameters parameters)
{
    await Task.Yield();
    await _pageDialogService.DisplayAlertAsync("確認", "aaaaaaa", "閉じる");
}

Issues(Google翻訳)によると、AppDelegate.FinishedLaunchingの呼び出しが完了するより前にPageDialogService.DisplayAlertAsyncが呼び出されることが原因のようです。
実際にデバッグでPageDialogServiceのMainPageがnullになっているのを確認できます。

ただこの問題はCanNavigateAsyncなどでは起こりません。
CanNavigateAsyncはNavigateAsyncのあとで呼び出しされ、
そのときにはViewの初期化は完全に終わってるはずなのでAppDelegate.FinishedLaunchingの呼び出しは完了してるはずです。

書き終わってから自信がなくなった…

ほんとにCanNavigateAsyncはFinishedLaunchingよりあと呼び出されるのか?
時間があったら調べて追記します。。。それか誰か教えてk(ry

これは動く

public async Task<bool> CanNavigateAsync(NavigationParameters parameters)
{
    return await _pageDialogService.DisplayAlertAsync("確認", "Text Speech画面へ遷移しますか?", "OK", "Cancel");
}

#遷移時は普通に動いてたから6時間くらい嵌った…