web-dev-qa-db-fra.com

Comment utiliser un ViewModelProvider.Factory lorsque s'étend depuis AndroidViewModel

Je veux envoyer un paramètre supplémentaire à mon ViewModel, mais cela s'étend de AndroidViewModel. Comment puis-je ajouter ce paramètre à la classe ViewModelFactory?

ViewModel

class ProjectViewModel(application: Application) : AndroidViewModel(application) {

    // need a param for project id...
}

ViewModelFactory

class ProjectViewModelFactory(val projectId: Int): ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        // need to send this...
        return ProjectViewModel(projectId) as T
    }
}

Remarque: je remarque que dans la documentation, il est dit: AndroidViewModel Les sous-classes doivent avoir un constructeur qui accepte Application comme seul paramètre.

Je ne sais donc pas s'il est possible (ou bon) de faire ce que j'essaie de faire.

10
mposadar

Obtenez ViewModel:

        viewModel = ViewModelProviders.of(this,
                new BListFactory(getActivity().getApplication(), 1))
                .get(BListViewModel.class);

Usine:

class BListFactory extends ViewModelProvider.NewInstanceFactory {

    @NonNull
    private final Application application;

    private final long id;

    public BListFactory(@NonNull Application application, long id) {
        this.application = application;
        this.id = id;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (modelClass == BListViewModel.class) {
            return (T) new BListViewModel(application, id);
        }
        return null;
    }
}

AndroidViewModel:

public class BListViewModel extends AndroidViewModel {

    private final long id;

    public BListViewModel(@NonNull Application application, final long id) {
        super(application);
        this.id = id;
    }
}
1
Andrey K