如何将字符串从android渲染页面传递到PCL页面

本文关键字:页面 PCL 字符串 android | 更新日期: 2023-09-27 18:27:15

如何将字符串值传递到android渲染页面到PCL页面。

我想将eventArgs.Account.Properties["access_token"]的令牌发送到PCL页面。

我该怎么办?请帮忙。

[assembly: ExportRenderer(typeof(LoginPage), typeof(LoginRender))]
namespace TestApp.Droid.Renderers
{
    public class LoginRender : PageRenderer
    {
    protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
        {
            base.OnElementChanged(e);
            // this is a ViewGroup - so should be able to load an AXML file and FindView<>
            var activity = this.Context as Activity;
            var auth = new OAuth2Authenticator(
                clientId: "", // your OAuth2 client id
                scope: "user_about_me", // the scopes for the particular API you're accessing, delimited by "+" symbols
                authorizeUrl: new Uri("https://www.facebook.com/dialog/oauth"), // the auth URL for the service
                redirectUrl: new Uri("https://www.facebook.com/connect/login_success.html")); // the redirect URL for the service
            auth.Completed += (sender, eventArgs) => {
                if (eventArgs.IsAuthenticated)
                {
                    Toast.MakeText(this.Context, eventArgs.Account.Properties["access_token"], ToastLength.Long).Show();
                    App.SuccessfulLoginAction.Invoke();
                    App.SaveToken(eventArgs.Account.Properties["access_token"]);
                }
                else
                {
                    // The user cancelled
                }
            };
            activity.StartActivity(auth.GetUI(activity));
        }
    }
}

应用程序

public class App
    {
        static NavigationPage _NavPage;
        public static Page GetMainPage()
        {
            var profilePage = new ProfilePage();
            _NavPage = new NavigationPage(profilePage);
            return _NavPage;
        }
        public static bool IsLoggedIn
        {
            get { return !string.IsNullOrWhiteSpace(_Token); }
        }
        static string _Token;
        public static string Token
        {
            get { return _Token; }
        }
        public static void SaveToken(string token)
        {
            _Token = token;
        }
        public static Action SuccessfulLoginAction
        {
            get
            {
                return new Action(() => {
                    _NavPage.Navigation.PopModalAsync();
                });
            }
        }
    }

上面是我的App.cs文件代码。静态方法不能返回令牌。

PCL中的ProfilePage.cs

public class ProfilePage : BaseContentPage
{
    public ProfilePage()
    {
        string tk = App.Token;
        var lbltoken = new Label()
        {
            FontSize = 20,
            HorizontalOptions = LayoutOptions.CenterAndExpand,
            Text = tk,
        };
        var stack = new StackLayout
        {
            VerticalOptions = LayoutOptions.StartAndExpand,
            Children = { lbltoken },
        };
        Content = stack;
    }
}   

如何将字符串从android渲染页面传递到PCL页面

我假设你已经在这里学习了这个例子:如何在Xamarin.Forms 中登录到facebook

在这种情况下,您可以通过调用App.Token 在PCL中使用它

如果这不起作用,请通过调用App.SaveToken(eventArgs.Account.Properties["access_token"]); 来创建您正在使用的字段的静态属性

通过您所做的编辑,很明显,您在App.Token有值之前设置了Label的值。

这里的一个快速解决方案可以是挂接Page.Appearing事件,就像这样;

public class ProfilePage : BaseContentPage
{
    private Label _lbltoken;
    public ProfilePage()
    {
        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;
    }
}

我已经将您的Label控件设置为一个私有变量,这样我们就可以很容易地从其他地方引用它,并为ProfilePage出现时创建一个事件处理程序。因此,每次出现Page时,它都会在Label中设置App.Token的值。

这应该行得通。然而,您可能会更好地查看MVVM之类的技术。