通过方向更改保留ViewModel

时间:2018-04-07 14:07:53

标签: android mvvm viewmodel screen-orientation

我有LoginActivity,其中ViewModel使用匕首注入。点击按钮后,LoginActivity会通过ViewModel调用API。同时,如果屏幕旋转,它会触发onDestroy的{​​{1}},然后我会处理该API调用。在此之后,在LoginActivity中,注入了新的ViewModel实例,因此,我的状态丢失了。我需要再次点按才能进行API调用。

这是我的LoginActivity:

onCreate()

这是我的LoginViewModel:

class LoginActivity : AppCompatActivity() {

    @Inject
    lateinit var loginViewModel: LoginViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        AndroidInjection.inject(this)

        val loginBinding = DataBindingUtil.setContentView<LoginBindings>(this, R.layout.activity_login)
        loginBinding.loginVm = loginViewModel
        loginBinding.executePendingBindings()
    }

    override fun onDestroy() {
        super.onDestroy()
        loginViewModel.onDestroy()
    }
}

我的BaseViewModel:

class LoginViewModel(private val validator: Validator,
                     private val resourceProvider: ResourceProvider,
                     private val authenticationDataModel: AuthenticationDataModel) : BaseViewModel() {

    val userName = ObservableField("")
    val password = ObservableField("")
    val userNameError = ObservableField("")
    val passwordError = ObservableField("")

    fun onLoginTapped() {

        // Validations
        if (!validator.isValidUsername(userName.get())) {
            userNameError.set(resourceProvider.getString(R.string.invalid_username_error))
            return
        }

        if (!validator.isValidPassword(password.get())) {
            passwordError.set(resourceProvider.getString(R.string.invalid_password_error))
            return
        }

        val loginRequest = LoginRequest(userName.get(), password.get())
        addToDisposable(authenticationDataModel.loginUser(loginRequest)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe { isApiCallInProgress.set(true) }
                .doOnDispose {
                    LogManager.e("LoginViewModel", "I am disposed, save me!!")
                    isApiCallInProgress.set(false) }
                .subscribe({ user ->
                    isApiCallInProgress.set(false)
                    LogManager.e("LoginViewModel", user.name)
                }, { error ->
                    isApiCallInProgress.set(false)
                    error.printStackTrace()
                }))
    }
}

这是提供ViewModel的模块:

open class BaseViewModel {

    private val disposables = CompositeDisposable()
    val isApiCallInProgress = ObservableBoolean(false)

    fun addToDisposable(disposable: Disposable) {
        disposables.add(disposable)
    }
    fun onDestroy() {
        disposables.clear()
    }
}

如何通过方向更改保留我的@Module class AuthenticationModule { @Provides fun provideLoginViewModel(validator: Validator, resourceProvider: ResourceProvider, authenticationDataModel: AuthenticationDataModel): LoginViewModel { return LoginViewModel(validator, resourceProvider, authenticationDataModel) } @Provides fun provideAuthenticationRepo(): IAuthenticationRepo { return AuthRepoApiImpl() } } (注意:我没有使用ViewModel。我应该制作我的ViewModel Architecture Components' ViewModel吗?或者还有其他方法吗?

0 个答案:

没有答案