• 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

  • 相关阅读:
    iOS 针对txt文档进行解码
    iOS导入其他APP下载的文件(用其他应用打开)
    地图定位
    NSURLSession
    利用box-shadow属性实现页面层叠效果
    利用vue-router和compoment重构代码--踩坑(一)
    markdown 一分钟入门
    webpack,配置,上手,例子
    在搜索框里添加放大镜的图标,且显示提示信息
    css3实现checkbox变开关按钮
  • 原文地址:https://www.cnblogs.com/yz1311/p/5486064.html
Copyright © 2020-2023  润新知