Xamarin.Forms之UserDialogs探究


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM