Forms中只提供了ActionSheet和Alert兩種Dialog,而且是Page級別的,這兩東西基本沒有用,必須要使用第三方的庫,目前支持最好\功能最強大的就是UserDialogs,沒有之一.
但是UserDialogs中會碰到很多問題,下面就記錄一下
1.除了標准的Dialog,像Toast Loading等這些都是會沖突的,也就是同一時間只能有一個在界面上
譬如如果前面有一個Loading,后面彈出一個Toast,會直接將Loading替換掉,即使Loading的時間未結束
PS:loading.Hide();方法不只是會影響Loading,其它的均會影響,原因:
public virtual void Hide() { this.IsShowing = false; this.activity.RunOnUiThread(() => AndHUD.Shared.Dismiss(this.activity)); }
16/11/1 6.2.3 該版本loading.Hide()並不是影響Toast的顯示(Android和iOS均不影響)
2.Async/await
一直沒弄懂它們直接的關系
Loading這個東西,在同步的時候,如果后面的代碼耗時很長,會導致不顯示,如果時間很短,有可能會顯示
var loading = UserDialogs.Instance.Loading("用戶登錄中..."); loading.Show(); var resultObject = WebServiceUtils.UserLogin(UserName,Password);
像上面的代碼,由於登錄的時間很長,點擊按鈕后,按鈕一直是被按壓狀態,也不顯示loading,全部結束完成后才恢復
var loading = UserDialogs.Instance.Loading("用戶登錄中..."); loading.Show(); await Task.Run(() => { var resultObject = WebServiceUtils.UserLogin(UserName, Password); //Todo });
前面一直都是這樣寫的,直接在Command中新增一個線程,之后的所有操作也全部放在線程中處理
var loading = UserDialogs.Instance.Loading("用戶登錄中..."); loading.Show(); var resultObject = await UserLoginAsync();
async Task<ResolvedResult<bool>> UserLoginAsync() { return WebServiceUtils.UserLogin(UserName, Password); }
如果是這種代碼,還是會造成界面卡死,因為async里面如果沒有await,方法將以同步的方式執行
正確的代碼是:
async Task<ResolvedResult<bool>> UserLoginAsync() { return await Task.Run(() => { return WebServiceUtils.UserLogin(UserName, Password); }); }
這種情況下,loading是可以顯示的
-----------------------------------------------------------------------------
更簡潔的方式:
var loading = UserDialogs.Instance.Loading("用戶登錄中..."); loading.Show(); var resultObject= await Task.Run<ResolvedResult<bool>>(() => WebServiceUtils.UserLogin(UserName,Password));
在獲取ResultObject的時候,將以異步的方式執行,這是的主線程可以進行其它任務,待獲取到結果后,后面可以以同步的方式繼續執行
3.Toasts
UserDialogs中使用Toasts,一直我是只顯示Title和Description的一個的,另外一個直接用null代替,這在Android中是沒問題的,但是在IOS中直接報空指針異常
,IOS中的Toasts樣式跟Android完全不同,跟'Toasts.Forms.Plugin'在Android中的表現一樣,從頂部滑出提示,分標題和信息
PS:在Android中,作者只是用了AndHUD,包含了全部的功能,但是在iOS中,作者使用了三個庫,所以,這會出現不同的情況
譬如,在顯示Loading的時候,然后彈出InfoToast時,Android下會直接將Loading取消掉,但是iOS下不會,這是你需要手動取消Loading
---------2016/9/21
最新版本6.2.3,現在的Toast依舊是無法隱藏Loading的(iOS),也就是說,如果兩個平台通用的話
------------------------------------------
1.loading自動顯示的問題
version:6.2.3(其余未測)
platform:iOS(android未測)
var loading = UserDialogs.Instance.Loading(""); var confirm = await UserDialogs.Instance.ConfirmAsync("確認'開始任務'操作", null, "催促", "返回"); if (confirm)
這種情況下,即使未調用loading.Show();依舊會顯示,而且在confirm的對話框之上(也就是無法取消)
2.ShowError現在可以隱藏Loading了
version:6.2.3(前面可以,但是特定情況下回導致界面變灰)
platform:iOS(android以前一直都可以)
------------------------------------
version:6.2.3版本,iOS和Android,ShowError都可以隱藏前面的Loading,但是Loading.Hide()對ShowError也是沒有影響的,所以,還是Hide Loading之后,然后再ShowError