如何将字符串从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;
}
}
我假设你已经在这里学习了这个例子:如何在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之类的技术。