将Droid项目中的字段传递给PCL,Xamarin.Forms

时间:2017-09-21 05:23:35

标签: facebook-graph-api xamarin asp.net-web-api xamarin.forms

我有一个应用程序,允许用户通过Facebook登录,一旦用户输入他们的凭据 - 我的api请求将用户保存到数据库并自动生成用户令牌(这对每个用户都是唯一的)。为了在用户登录后显示用户特定的详细信息 - 需要引用令牌。我试图将此令牌添加到PCL项目,但它只为令牌返回null。当我尝试传递另一个字符串,如名称,它传递正确的值。任何帮助将不胜感激。谢谢

droid中的FacebookRender:

 public class FacebookRender : PageRenderer
    {
        public FacebookRender()
        {
            CustomerService customerService = new CustomerService();
            String error;
            var activity = this.Context as Activity;

            var auth = new OAuth2Authenticator(
                clientId: "",
                scope: "",
                authorizeUrl: new Uri("https://www.facebook.com/dialog/oauth/"),
                redirectUrl: new Uri("https://www.facebook.com/connect/login_success.html")
                );

            auth.Completed += async (sender, eventArgs) =>
                {
                    try
                    {
                        if (eventArgs.IsAuthenticated)
                        {
                            await AccountStore.Create().SaveAsync(eventArgs.Account, "FacebookProviderKey");

                            var accessToken = eventArgs.Account.Properties["access_token"].ToString();
                            var expiresIn = Convert.ToDouble(eventArgs.Account.Properties["expires_in"]);
                            var expiryDate = DateTime.Now + TimeSpan.FromSeconds(expiresIn);

                            var request = new OAuth2Request("GET", new Uri("https://graph.facebook.com/me?fields=email,first_name,last_name,gender,picture"), null, eventArgs.Account);
                            var response = await request.GetResponseAsync();
                            var obj = JObject.Parse(response.GetResponseText());

                            var id = obj["id"].ToString().Replace("\"", "");
                            var name = obj["first_name"].ToString().Replace("\"", "");
                            var surname = obj["last_name"].ToString().Replace("\"", "");
                            var gender = obj["gender"].ToString().Replace("\"", "");
                            //var email = obj["email"].ToString().Replace("\"", "");

                            Customer.Customers cust = new Customer.Customers();
                            cust.Credentials = new Customer.Credentials();
                            cust.Name = name;
                            cust.Surname = surname;
                            cust.Email = "";
                            cust.MobilePhone = "";
                            cust.DOB = DateTime.Now;
                            cust.Number = "";
                            cust.City = "";
                            cust.Region = "";
                            cust.Country = "";
                            cust.DeviceToken = "sample";
                            cust.Credentials.SecretKey = "";

                            await customerService.AddCustomer(cust);

                            App.SaveToken(cust.Credentials.Token); - **//This is where I am passing the token**

                            App.NavigateToProfile(string.Format(name + surname));


                        }
                        else
                        {
                            App.NavigateToProfile("Invalid Login");
                        }
                    }
                    catch(Exception ex)
                    {
                        error = ex.Message;
                    }
                };
            activity.StartActivity(auth.GetUI(activity));
        }

App.cs

 public App()

 {
        InitializeComponent();


        MainPage = new NavigationPage(new MainPage());
    }
    public static void NavigateToProfile(string message)
    {
        App.Current.MainPage = (new Profile(message));
    }

    static string _Token;
    public static string Token
    {
        get { return _Token; }
    }

    public static void SaveToken(string token)
    {
        _Token = token;
    }

AboutPage.cs - 我在标签中传递令牌只是为了看它是否通过

public partial class About : ContentPage
    {
        private Label _lbltoken;
        public About()
        {
            //InitializeComponent();
            Appearing += (object s, EventArgs a) => {
                _lbltoken.Text = App.Token;
            };

            string tk = App.Token;

            _lbltoken = new Label()
            {
                FontSize = 20,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                Text = tk,
            };
            var stack = new StackLayout
            {
                VerticalOptions = LayoutOptions.StartAndExpand,
                Children = { _lbltoken },
            };
            Content = stack;

        }


    }

2 个答案:

答案 0 :(得分:0)

您可以使用MessagingCenter。 消息可能会像按钮单击,系统事件或其他事件一样发送。订阅者可能正在侦听以更改用户界面的外观,保存数据或触发其他操作。

More Info

答案 1 :(得分:0)

如果它的好主意在App类中使用静态字段,我现在不是真的。 Xamarin使用服务定位器App.Current.[property]访问所有字段我建议您尝试将这些字段更改为公开

string _Token;
public string Token
{
  get { return _Token; }
}

public void SaveToken(string token)
{
  _Token = token;
}

并将其与App.Current.SaveToken(token)App.Current.Token

一起使用