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

原文地址:https://www.cnblogs.com/yz1311/p/5486064.html