• Xamarin开发登录示例


    Xamarin开发登录示例

    登录视图模型:

    class LoginViewModel
    {
        public string Email { get; set; }
        public string Password { get; set; }
        public ICommand LoginCommand
        {
            get
            {
                return new Command(async () =>
                {
                    ApiServices apiServices = new ApiServices();
                    var accesstoken = await apiServices.LoginUserAsync(Email, Password);
                    Settings.AccessToken = accesstoken;
                });
            }
    
        }
    
        public LoginViewModel()
        {
            Email = Settings.Username;
            Password = Settings.Password;
        }
    
    }
    

    登录:

    public async Task<string> LoginUserAsync(string email, string password)
    {
        var client = new HttpClient();
    
        var keyValues = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("username", email),
            new KeyValuePair<string, string>("password", password),
            new KeyValuePair<string, string>("grant_type", "password")
        };
    
        var request = new HttpRequestMessage(
            HttpMethod.Post, "linktotoken");
    
        request.Content = new FormUrlEncodedContent(keyValues);
        var reponse = await client.SendAsync(request);
    
        var jwt = await reponse.Content.ReadAsStringAsync();
        JObject jwtDyanmic = JsonConvert.DeserializeObject<dynamic>(jwt);
    
        var accessToken = jwtDyanmic.Value<string>("access_token");
        var accessTokenExpiration = jwtDyanmic.Value<DateTime>(".expires");
        Settings.AccessTokenExpiration = accessTokenExpiration;
    
        Debug.WriteLine(jwt);
    
        return accessToken;
    }
    

    LoginPage.xaml:

    <ContentPage.BindingContext>
    <vm:LoginViewModel/>
    </ContentPage.BindingContext>
    
    
    <StackLayout VerticalOptions="Center">
    <Entry Text="{Binding Email}" />
    <Entry Text="{Binding Password}" />
    <Button Command="{Binding LoginCommand}" Text="Login/Signin" />
    </StackLayout>
    

    App.xaml.cs

    public App ()
    {
        InitializeComponent();
    
        SetMainPage();
    }
    
    private void SetMainPage()
    {
        if (!string.IsNullOrEmpty(Settings.AccessToken))
        {
            if (DateTime.UtcNow.AddHours(1) > Settings.AccessTokenExpiration)
            {
                var vm = new LoginViewModel();
                vm.LoginCommand.Execute(null);
            }
            MainPage = new NavigationPage(new GSMUnitsPage());
        }
        else if(!string.IsNullOrEmpty(Settings.Username) && !string.IsNullOrEmpty(Settings.Password))
        {
            MainPage = new NavigationPage(new LoginPage());
        }
        else
        {
            MainPage = new NavigationPage(new RegisterPage());
        }
    }



    此事例关键是要关注一个问题,它不同于安卓原生的方式登陆成功后关闭登陆页面,这里是采用重新指定mainpage也就是根页面的方式达到目的
  • 相关阅读:
    Linux中history执行历史命令方法
    Linux中返回上一次目录
    Linux的vi编辑模式下常用快捷键
    [Android] TextView上同时显示图标和文字
    [Android] macOS的Android Studio快捷键
    [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩
    [iOS] 测试设备解决自签名证书问题
    [macOS] keychain的跳坑之旅!git拉取的权限问题
    [PHP] swoole在daemonize模式下,chdir失效问题
    [macOS] macOS下,VirtualBox安装CentOS7.4, 搭建nginx, mysql, PHP5.6&PHP7.1
  • 原文地址:https://www.cnblogs.com/yzmn/p/13056807.html
Copyright © 2020-2023  润新知