Обычно у меня есть индикатор активности, который не отображается до тех пор, пока не будет выполнен весь остальной код метода. Я посмотрел, и для свойства IsBusy устанавливается значение true как на стороне кода (страница входа), так и в привязке xaml (вход в систему xaml), поэтому я знаю, что правильное значение по крайней мере передается.
Я почти уверен, что у меня все настроено правильно, поскольку async / await ничего не блокирует.
У меня есть класс BaseViewModel, который используют все мои модели представления. Вот код для IsBusy:
bool isBusy = false;
public bool IsBusy
{
get { return isBusy; }
set { SetProperty(ref isBusy, value); }
}
protected bool SetProperty<T>(ref T backingStore, T value,
[CallerMemberName]string propertyName = "",
Action onChanged = null)
{
if (EqualityComparer<T>.Default.Equals(backingStore, value))
return false;
backingStore = value;
onChanged?.Invoke();
OnPropertyChanged(propertyName);
return true;
}
Вот мой XAML для страницы входа. Индикатор активности размещается внутри единственного макета стека внутри тега страницы содержания:
<ActivityIndicator IsRunning="{Binding IsBusy}"
IsVisible="{Binding IsBusy}"
HeightRequest="40"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand">
<ActivityIndicator.WidthRequest>
<OnPlatform x:TypeArguments="x:Double" iOS="100" Android="100" />
</ActivityIndicator.WidthRequest>
<ActivityIndicator.Color>
<OnPlatform x:TypeArguments="Color"
iOS="#2499CE" />
</ActivityIndicator.Color>
</ActivityIndicator>
А вот код LoginPageViewModel. Если я правильно понимаю, индикатор должен отображаться, как только он будет установлен в значение true в первой строке, а затем исчезнет после того, как вызов API будет выполнен, а пользователь не аутентифицирован.
public async void OnLogin()
{
IsBusy = true;
var isAuthenticated = await LoginPageValidation.IsAuthenticated(email, password);
if (!isAuthenticated )
{
IsBusy = false;
IsForgotPasswordLabelVisible = true;
DisplayUserAndPasswordMismatchPrompt();
return;
}
}
Я уверен, что проблема в чем-то небольшом, но я этого просто не вижу.
РЕДАКТИРОВАТЬ: добавление методов IsAuthenticated
IsAuthenticated
public static async Task<bool> IsAuthenticated(string email, string password)
{
var isAuthenticated = false;
try
{
var payload = $"{{\n\t\"Email\":\"{email}\",\n\t\"Password\":\"{password}\"\n}}";
var response = await LoginApi.Authenticate(payload);
isAuthenticated = bool.Parse(response["isAuthenticated"].ToString());
}
catch (Exception e)
{
// log stuff here
}
return isAuthenticated;
}
Аутентифицировать вызов API:
public static async Task<JObject> Authenticate(string payloadBody)
{
IRestResponse response = null;
try
{
var client = new RestClient($"{url}/authenticate");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("undefined", payloadBody, ParameterType.RequestBody);
response = client.Execute(request);
} catch (Exception e)
{
// log some bad stuff here
}
return JObject.Parse(response.Content);
}
isBusy
является защищенным или частным? - person Lindsay   schedule 30.12.2019IsAuthenticated
с задержкой, и он работает, не могли бы вы показать свойIsAuthenticated
? или, если возможно, вы можете поделиться упрощенным примером - person Leo Zhu - MSFT   schedule 30.12.2019IsBusy = true;
, когда вы вызываете методOnLogin
, если да, попробуйте использоватьclient.ExecuteAsync
вместоclient.Execute
- person Leo Zhu - MSFT   schedule 30.12.2019