如何在Xamarin PCL中显示错误消息

时间:2017-05-07 19:43:10

标签: xamarin error-handling portable-class-library display printer-control-language

我正在做一个简单的try / catch(在PCL项目中)来验证用户与应用程序的连接,但我似乎无法找到Xamarin网站示例中使用的DisplayAlert()方法。

以下是我的用法:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Security;
using System.Diagnostics;

以下是代码:

public async Task Connexion()
        {
            // on met en place un try catch pour déceler toute erreur dans la procédure de connexion
            try
            {
                // url de récupération du json de l'acteur
                string urlActeur = "http://10.0.0.5/ppe3JoJuAd/gsbAppliFraisV2/webservices/w_visiteur.php" + "?" + "login=" + Login + "&" + "pass=" + Pass;

                //instanciation du client http qui envoi un header json
                HttpClient clientActeur = new HttpClient();
                clientActeur.DefaultRequestHeaders.Accept.Clear();
                clientActeur.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                //réponse à la requête Http
                var response = await clientActeur.GetAsync(urlActeur);
                var json = response.Content.ReadAsStringAsync().Result;
                var acteurJson = JsonConvert.DeserializeObject<ActeurJson>(json);

                //on vérifie les informations de connexion du user (ici cela se ait avec oldMdp car pas d'implémentation du SHA1 actuellement en Xamarin, auquel cas nous auions converti le contenu du champ pass en sha1 puis vérification avec le champ mdp de l'acteur)
                if (acteurJson.Acteur.login == login && acteurJson.Acteur.mdp == acteurJson.Acteur.oldMdp)

                    App.Current.MainPage = new VisitePage();
            }
            catch
            {
                await DisplayAlert()//intelisense does not find the using or the required dll

            }

我应该在哪里查看或者我该怎么做才能显示消息?

3 个答案:

答案 0 :(得分:2)

您不应该从任务中执行DisplayAlert。您应该将有关失败的消息中继回调用类,或者只是将异常提升到调用类。对于返回UI并发出消息的任务是不好的。

此外,您对HttpClient的使用已关闭。 HttpClient旨在用作单例方法。尝试为每个项目或模块创建一个静态单例。

所有这一切,试试这个:

public class ConnexionHelper
{
    public async Task Connexion()
    {
        try
        {
            System.Diagnostics.Debug.WriteLine("trying stuff");
        }
        catch( Exception ex )
        {
            Xamarin.Forms.Page ourPage = App.Current.MainPage.Navigation.NavigationStack.LastOrDefault();
            if (ourPage != null)
            {
                await ourPage.DisplayAlert("eeek", "error has occurrred", "not ok");
            }
        }
    }

答案 1 :(得分:1)

最好为xamarin添加userdialogs插件。它提供了不同类型的警报,敬酒等,用于在UI中显示消息。它还提供了更好的用户界面。

您可以从https://www.nuget.org/packages/Acr.UserDialogs/

安装用户对话框

安装后,您可以显示如下警告: UserDialogs.Instance.Alert(&#34;&#34;&#34;&#34;&#34; OK&#34;&GT);

您还可以将警报显示为祝酒词。

答案 2 :(得分:0)

您可以使用Toasts.Forms.Plugin

显示Toast消息

<强>设置

在您的iOS,Android,WinRT和UWP项目中,请致电:

DependencyService.Register<ToastNotification>(); // Register your dependency
ToastNotification.Init();

// If you are using Android you must pass through the activity
ToastNotification.Init(this);

如果您使用的是Xamarin Forms,则必须在调用Xamarin.Forms.Init();

之后执行此操作。

<强>权限

在iOS中,您必须先请求显示本地通知的权限,因为这是用户中断操作。

// Request Permissions
if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
{
    // Request Permissions
    UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (granted, error) =>
    {
        // Do something if needed
    });
}
else if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
{
    var notificationSettings = UIUserNotificationSettings.GetSettingsForTypes(
    UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, null);

    app.RegisterUserNotificationSettings(notificationSettings);
}

<强>用法

使用依赖服务来解析IToastNotificator。

var notificator = DependencyService.Get<IToastNotificator>();

var options = new NotificationOptions()
            {
                Title = "Title",
                Description = "Description"
            };

var result = await notificator.Notify(options);

返回的结果是带有Action的NotificationResult,其中包含以下值之一。

[Flags]
public enum NotificationAction
{
    Timeout = 1, // Hides by itself
    Clicked = 2, // User clicked on notification
    Dismissed = 4, // User manually dismissed notification
    ApplicationHidden = 8, // Application went to background
    Failed = 16 // When failed to display the toast
}

如果您需要Clicked NotificationAction,则必须在NotificationOptions中设置IsClickable = true。