Совместное использование данных между различными моделями представления, используя Shared ViewModel в Android - PullRequest
1 голос
/ 08 марта 2020

У меня есть несколько фрагментов, каждый из которых имеет отдельный ViewModel. Теперь я хочу избежать передачи данных в качестве аргумента между моим Fragments и вместо этого использовать SharedViewModel между моим Viewmodels и каким-либо образом наследовать Sharedviewmodel для обновления моих состояний данных. Любая помощь?

1 Ответ

0 голосов
/ 08 марта 2020

Наследование ViewModel, вероятно, является неподходящим инструментом для этого, поскольку ViewModel предназначен для привязки к жизненному циклу определенного c Фрагмента или Действия. Лучшим подходом было бы иметь истинный класс «Модель», который управляет постоянным состоянием данных (одноэлементным или иным), с которым взаимодействует отдельный ViewModels. Например:

class Database {

    private static Database instance = null;

    public static synchronized Database getInstance() {
        if( instance == null ) {
            instance = new Database();
        }
        return instance;
    }

    private Database() {}

    private int mValue = 0;
    public void setValue(int v) { mValue = v; }
    public int getValue() { return mValue; }
}


class FragmentAViewModel extends ViewModel {

    private final Database db;

    FragmentAViewModel() {
        db = Database.getInstance();
    }

    // FragmentA can set and get state on Database as needed
    void setValue(int v) {
        db.setValue(v);
    }
}

class FragmentBViewModel extends ViewModel {

    private final Database db;

    FragmentBViewModel() {
        db = Database.getInstance();
    }

    // FragmentB can set and get state on Database as needed
    int getValue() {
        return db.getValue();
    }
}

Другой вариант - создать ViewModel уровня активности. Если все фрагменты находятся в пределах одного и того же действия, они могут совместно использовать эту модель представления активности. Например:

mFragmentViewModel = ViewModelProviders.of(this).get(FragmentViewModel.class);

MainActivity a = (MainActivity)requireActivity();
mActivityViewModel = ViewModelProviders.of(a).get(MainActivityViewModel.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...