Xamarin Порядок инициализации - PullRequest
0 голосов
/ 25 января 2019

В моем проекте Xamarin.Forms у меня есть центральная модель данных под названием DataStore, которая постоянно извлекает данные JSON из веб-сокета, преобразует их в объекты и сохраняет их в Dictionary. Мне нужно получить доступ к этому DataStore из нескольких ViewModels и Views. Для этого я сделал следующее:

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Foo
{
    public partial class App : Application
    {
        public DataStore dataStore { get; }

        public static App current = (App)Application.Current;

        public App()
        {
            InitializeComponent();

            dataStore = new DataStore();

            MainPage = new MainPage();
        }
    }
}

А у самого DataStore есть следующие события:

namespace Foo
{
    public class DataStore
    {
        Dictionary<int, Target> targetDict;
        public EventHandler<Target> targetAdded;
        public EventHandler<Target> targetRemoved;
    }
}

Таким образом, я могу подключиться к событиям DataModel во всех ViewModels или Views, где они мне нужны, следующим образом:

namespace Foo
{
    public class TargetMap : Map
    {
        public List<CustomPin> customPins { get; set; }

        public TargetMap() : base()
        {
            customPins = new List<CustomPin>();

            App.current.dataStore.targetAdded += onTargetAdded;
            App.current.dataStore.targetRemoved += onTargetRemoved;
        }

        void onTrackRemoved(object sender, Target t)
        {
            // Do stuff
        }

        void onTrackAdded(object sender, Track t)
        {
            // Do stuff
        }
    }
}

Однако я сталкиваюсь с исключениями нулевого указателя, которые говорят мне, что у меня проблема с порядком инициализации.

Вопрос:

Где и как будет «Xamarin» способ инициализации центрального компонента слоя данных, такого как DataStore, если к нему требуется доступ из нескольких ViewModel и Views? Вы бы просто сделали это статичным?

Любой намек очень ценится!

1 Ответ

0 голосов
/ 25 января 2019

Из того, что я понимаю по вашей проблеме, у вас есть два варианта

1) Создайте единичный элемент из своего хранилища данных (так что да, статическое свойство), чтобы сделать его доступным из любого места в вашем приложении

2) Создайте абстракцию своего хранилища данных и вставьте эту абстракцию при запуске (лучшее решение imo)

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

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