【问题标题】:How to pass string from android render page to PCL page?如何将字符串从 android 渲染页面传递到 PCL 页面?
【发布时间】:2016-03-23 23:16:08
【问题描述】:

如何将字符串值传递给 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));
        }
    }
}

App.cs

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;
    }
}   

【问题讨论】:

    标签: c# .net xamarin xamarin.android xamarin.forms


    【解决方案1】:

    我假设您在此处遵循此示例:How to login to facebook in Xamarin.Forms

    在这种情况下,您可以通过调用 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 这样的技术。

    【讨论】:

    • 我知道!您能出示您的App 代码吗?在您发布的代码中,您执行App.SaveToken(eventArgs.Account.Properties["access_token"]);,因此您将令牌值保存到应用程序类中的变量中。 App 类中可能还有一个静态属性,您可以使用它访问应用程序中任何页面或任何位置的令牌
    • 就像我说的,你的 App 类中有一个静态属性 Token。因此,当您设置了令牌后,您可以在任何地方通过App.Token 访问它
    • 没错。你是对的......但我不能在标签中显示令牌。请参阅更新后的 profilepage.cs 文件代码。
    • 那是因为您的Page 是在Token 被填充之前创建的。因此,您应该创建一种机制来在设置时更新 UI 中的值。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多