Является ли моя ошибка загрузки значка проблемой форм Xamarin или моей проблемой кода - PullRequest
0 голосов
/ 21 февраля 2020

Я думал, что моя ошибка связана с Xamarin Forms, потому что в XF3.4 ошибки не было, но она появилась после того, как я обновился до XF4.4.

Просто чтобы убедиться, я хочу показать вам, ребята, код. У меня есть страница XAML со значком загрузки:

<ActivityIndicator IsRunning="{Binding Loading}"
                   IsVisible="{Binding Loading}"
                   AbsoluteLayout.LayoutFlags="All"
                   AbsoluteLayout.LayoutBounds="0.5, 0.5, 0.2, 0.2">
    <ActivityIndicator.Color>
        <OnPlatform x:TypeArguments="Color" iOS="#2499CE" WinPhone="#2499CE" />
    </ActivityIndicator.Color>
</ActivityIndicator>

Логическое значение «Загрузка» привязано к модели страницы здесь:

public class MyLoginWebPageModel : BasePageModel
{
    private BrowserOptions _options;
    private Action<BrowserResult> _trySetResult;
    private BrowserResult _result = new BrowserResult() { ResultType = BrowserResultType.UserCancel };
    private Boolean _navPopped = false;

    public string StartUrl { get; private set; }

    public bool Loading { get; set; } = false;    // RIGHT HERE!!!!!!!!!!!!!!!!!!!!!!

    public OidcLoginWebPageModel(ICoreDataRepository repository, ILoginProvider loginProvider, ICache cache, IEventTrace trace, IUsageTimer usageTimer, IPlatform platform)
            : base(loginProvider, cache, trace, usageTimer, platform){}

    public override void Init(object initData)
    {
        base.Init(initData);
        Tuple<BrowserOptions, Action<BrowserResult>> initObject = initData as Tuple<BrowserOptions, Action<BrowserResult>>;
        _options = initObject.Item1;
        _trySetResult = initObject.Item2;
        StartUrl = _options.StartUrl;
    }

    protected override void OnPageWasPopped(object sender, EventArgs e)
    {
        base.OnPageWasPopped(sender, e);
        _trySetResult(_result);
    }

    internal async Task OnBrowserNavigated(object sender, WebNavigatedEventArgs e)
    {
        Loading = false;
        if (!(sender is WebView browser))
        {
            throw new Exception($"Sender is not of type WebView");
        }
        if (!Uri.TryCreate(e.Url, UriKind.Absolute, out Uri uri))
        {
            throw new Exception($"Uri creation failed for: {e.Url}");
        }

        if (string.IsNullOrEmpty(_options.EndUrl))
        {
            if (uri.LocalPath.ToLowerInvariant() == "/account/logout")
            {
                _result = new BrowserResult() { ResultType = BrowserResultType.Success };
                if (!_navPopped)
                {
                    _navPopped = true;
                    await PopPageModel();
                }
            }
        }
    }

    internal async Task OnBrowserNavigating(object sender, WebNavigatingEventArgs e)
    {
        Loading = true;
        if (!(sender is WebView browser))
        {
            throw new Exception($"Sender is not of type WebView");
        }
        if (!Uri.TryCreate(e.Url, UriKind.Absolute, out Uri uri))
        {
            throw new Exception($"Uri creation failed for: {e.Url}");
        }

        if (string.IsNullOrEmpty(_options.EndUrl) == false)
        {
            if (uri.AbsoluteUri.StartsWith(_options.EndUrl))
            {
                _result = new BrowserResult() { ResultType = BrowserResultType.Success, Response = uri.Fragment.Substring(1) };
                e.Cancel = true;
                if (!_navPopped)
                {
                    _navPopped = true;
                    Loading = false;
                    await PopPageModel();
                }
            }
        }
    }
}

Есть ли здесь что-либо, что указывало бы на значок загрузки вообще не исчезает?

Спасибо!

edit: Так вот, я думаю, что мне нужно сделать.

Сначала я изменяю свою логическую ситуацию

private bool Loading = false;
public bool currentlyLoading
{
    get { return Loading; }
    set 
    { 
        currentlyLoading = Loading;
        onPropertyChanged();
    }
}

Затем в том же файле я реализую функцию onPropertyChanged (), чтобы ... сообщить свойству Bindable в моем файле xaml, что свойство изменилось ?

Это хорошая реализация?

// Option 1
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

// Option 2
protected void OnPropertyChanged(string propertyName)
{
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
}

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

ваш класс (или его базовый класс) должен реализовать INotifyPropertyChanged. Тогда ваше свойство Loading будет выглядеть примерно так

private bool loading = false;

public bool Loading
{
    get { return loading; }
    set 
    { 
        loading = value;
        OnPropertyChanged();
    }
}
1 голос
/ 22 февраля 2020

Вариант 1 самый лучший. Но было бы хорошо, если бы вы переместили свою собственность, изменив логи c на BasePageModel.

0 голосов
/ 21 февраля 2020

Попробуйте это:

private bool _loading { get; set; }
public bool Loading { get {return _loading; } set{value = _loading } }

И в вашем OnBrowserNavigating :

internal async Task OnBrowserNavigating(object sender, WebNavigatingEventArgs e)
{
    Loading = true;
    if (!(sender is WebView browser))
    {
        Loading = false;
        throw new Exception($"Sender is not of type WebView");
    }
    if (!Uri.TryCreate(e.Url, UriKind.Absolute, out Uri uri))
    {
        Loading = false;
        throw new Exception($"Uri creation failed for: {e.Url}");
    }

    if (string.IsNullOrEmpty(_options.EndUrl) == false)  //IF THE CONDITION OVER HERE & FOR INNER IF CONDITIONS FAILS, LOADER WASNT SET TO FALSE 
    {
        if (uri.AbsoluteUri.StartsWith(_options.EndUrl))
        {
            _result = new BrowserResult() { ResultType = BrowserResultType.Success, Response = uri.Fragment.Substring(1) };
            e.Cancel = true;
            if (!_navPopped)
            {
                _navPopped = true;
                Loading = false;
                await PopPageModel();
            }
        }
    }
    Loading = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...