LoginSignup
1
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-21

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時間くらい嵌った…

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2