Android путаница с ViewModels, ViewModelStoreOwner и состоянием - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь написать простую игру с некоторым состоянием (текущий счет игрока, позиция игрока и других жителей мира). Но не состояние хранится в БД или внешне. Это нормально для того, чтобы это было сброшено, когда MainActivity воссоздается.

Я понимаю, что не собираюсь сохранять это состояние в Activity. Предположительно, даже не мой MainActivity.

Так что я могу создать для него подкласс ViewModel.

Теперь, глядя на различные онлайн-примеры, кажется, что я должен получить этот объект ViewModel, выполнив что-то подобное в MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    GameViewModel model = new ViewModelProvider(this).get(GameViewModel.class);

    model.addObserver( new Observer() {    
        public void update(Observable o, Object arg) {
            REDRAW WORLD
        }
    });
}

Моя первая проблема заключается в том, что я получаю

error: no suitable constructor found for ViewModelProvider(MainActivity)
    GameViewModel model = new ViewModelProvider(this).get(GameViewModel.class);

. ViewModelProvider не может быть создан с MainActivity как его ViewModelStoreOwner. Но что должно быть ViewModelStoreOwner в моем случае? Это еще один объект, который я должен создать где-нибудь? И в каком объеме?

Второй вопрос: я хочу, чтобы пользовательский ввод обновлял состояние в моей GameViewModel. Но обработчик пользовательского ввода (onTouchEvent) присоединяется к моему GameSurfaceView. (Подкласс GLSurfaceView)

Но, похоже, GameSurfaceView или MainActivity ничего не знают друг о друге. Итак, как GameSurfaceView.onTouchEvent может завладеть моей GameViewModel, на которую есть ссылка в MainActivity?

Это даже предназначено? Или GameViewModel просто предназначен для использования в качестве прокси для хранения информации в другом месте? И если да, то где это где-то еще?

Это все очень запутанно.

...