Каков наилучший способ получения данных при создании страницы Xamarin? - PullRequest
2 голосов
/ 12 мая 2019

Я создаю приложение Xamarin, которое взаимодействует с устройством BLE. В настоящее время я создаю что-то вроде «проводника»; У меня есть страница со списком из 3 «типов файлов», которые можно загрузить с устройства; при нажатии элемента я хотел бы создать новую страницу (используя Navigation.PushAsync()) со списком файлов, извлеченных с устройства. Я реализую его, используя страницу, которая создает конструктор и привязывает его к своей модели представления, но я не могу вызвать асинхронный метод для загрузки данных в конструктор.

Это плохой дизайн или есть способ начать загрузку информации во время создания модели представления?

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Пока ваш идентификатор данных загружен, вы можете открыть новую страницу с индикатором активности, привязанным к свойству IsBusy из YourViewModel.

Затем вы можете начать загрузку с новой задачи, например так:

public class YourViewModel
{
    private bool isBusy;
    public bool IsBusy
    {
        get => isBusy;
        set => SetProperty(isBusy, value);
    }

    public YourViewModel()
    {
        StartDownload();
    }

    private void StartDownload()
    {
        IsBusy = true;

        Task.Run(ExceptionHandler(async() => 
            {
              // Your download starts here
              // await it
              // and when it came finished:
              Device.BeginInvokeOnMainThread(() => IsBusy = false);
            }));
    }

    private void ExceptionHandler(Action action)
    {
        try
        {
            action?.Invoke();
        }
        catch(Exception ex)
        {
            // Handle exceptions here
        }
    }
}

Вы можете добавлять компоненты страницы через события из модели представления или что-то в этом роде.

Надеюсь, это поможет.

0 голосов
/ 14 мая 2019

В качестве альтернативного подхода вы можете определить метод LoadDataAsync в вашей ViewModel и вызвать его из метода OnAppearing вашего представления. Вы должны пометить это как асинхронный:

public class MyView : ContenPage {

    private bool isDataLoaded = false;

    public void MyView {
        BindingContext = new MyViewModel();
    }

    protected async override void OnAppearing(){
        if (!isDataLoaded && BindingContext is MyViewModel vm){
            await vm.LoadDataAsync();
            isDataLoaded = true;
        }
    }
}

Обратите внимание на поле isDataLoaded: установите это значение на true после извлечения данных. Избегайте повторного извлечения данных при переходе назад с другой страницы (это может или не может быть полезно в зависимости от логики вашего приложения).

В вашем методе LoadDataAsync в ViewModel вы можете вставить код извлечения данных в обычный блок try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...