How to use a ViewModelProvider.Factory when extends from AndroidViewModel

99封情书 提交于 2020-04-06 02:34:19

问题


I want to send an extra parameter to my ViewModel, but this extends from AndroidViewModel. How can I add this parameter to the ViewModelFactory class ?

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
    }
}

Note: I notice that in the documentation its says: AndroidViewModel Subclasses must have a constructor which accepts Application as the only parameter.

So I don't know if it is posible (or good) to do what I'm trying to do.


回答1:


Get ViewModel:

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

Factory:

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;
    }
}



回答2:


For users looking for a Kotlin example and stumbled here:

1.) Make your ViewModel class that accepts parameter:

class ProfileViewModel(val userId: Int): ViewModel() {
    init {
        Log.i("ProfileViewModel", "userId: $userId")
    }
}

2.) Make your Factory class, this will also accept the parameter and pass on to your ViewModel

class ResultViewModelFactory(private val userId: Int) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(ResultViewModel::class.java)) {
            return ResultViewModel(userId) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

3.) Make two lateinit var in your Activity/Fragment, initialise them in onCreate/onCreateView as

 viewModelFactory = ProfileViewModelFactory(userId)
 viewModel = ViewModelProviders.of(this, viewModelFactory)
            .get(ProfileViewModel::class.java)


来源:https://stackoverflow.com/questions/51829280/how-to-use-a-viewmodelprovider-factory-when-extends-from-androidviewmodel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!