如何在android中从viewmodel调用baseactivity函数
您好我有LoginActivity
和LoginViewModel
和一些更多的类。 我有showLoading
并hideLoading
在BaseActivity
所以它可以从每个活动访问。
我能够从LoginViewModel
像mNavigator?.startForgotPasswordActivity()
调用LoginActivity
方法mNavigator?.startForgotPasswordActivity()
我想从LoginViewModel
调用它,然后使用MVVM做到这一点? 或者我正在用错误的方法去做。 请建议什么是正确的方法来做到这一点?
BaseActivity.kt
abstract class BaseActivity : AppCompatActivity(), AnkoLogger { private val progressBar: ProgressBar? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } protected fun getToolbar(): Toolbar { val toolbar: Toolbar = findViewById(R.id.toolbar) setSupportActionBar(toolbar) return toolbar } protected fun performDependencyInjection() { AndroidInjection.inject(this); } @TargetApi(Build.VERSION_CODES.M) fun requestPermissionsSafely(permissions: Array<String>, requestCode: Int) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(permissions, requestCode) } } @TargetApi(Build.VERSION_CODES.M) fun hasPermission(permission: String): Boolean { return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED } fun isNetworkConnected(): Boolean { return NetworkUtils.isNetworkConnected(applicationContext) } fun showLoading() { hideLoading() // show progress bar } fun hideLoading() { // hide progress bar } }
LoginActivity.kt
class LoginActivity : BaseActivity(), LoginNavigator { @Inject lateinit var loginViewModel: LoginViewModel override fun onCreate(savedInstanceState: Bundle?) { performDependencyInjection() super.onCreate(savedInstanceState) val activityLoginBinding: ActivityLoginBinding = DataBindingUtil.setContentView<ActivityLoginBinding>(this, R.layout.activity_login) activityLoginBinding.loginViewModel = loginViewModel loginViewModel.mNavigator = this } override fun startHomeActivity() { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun startRegistrationActivity() { startActivity(Intent(this, RegistrationActivity::class.java)) } override fun startForgotPasswordActivity() { startActivity(Intent(this, ForgotPasswordActivity::class.java)) } override fun handleError(throwable: Throwable) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }
LoginViewModel.kt
class LoginViewModel : BaseViewModel<LoginNavigator>(), AnkoLogger { val emailField = ObservableField<String>() private val email: String get() = emailField.get() val passwordField = ObservableField<String>() private val password: String get() = passwordField.get() @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") fun login(view: View) { if (isEmailAndPasswordValid(email, password)) { ApiHelperImpl().doServerLoginApiCall(email, password) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : CallbackWrapper<LoginResponse>() { override fun onSuccess(loginResponse: LoginResponse) { info { loginResponse } } }) } } /** * Validate email and password. It checks email and password is empty or not * and validate email address is correct or not * @param email email address for login * @param password password for login * @return true if email and password pass all conditions else false */ private fun isEmailAndPasswordValid(email: String, password: String): Boolean { if (email.isEmpty()) return false if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) return false if (password.isEmpty()) return false return true } }
BaseViewModel.kt
abstract class BaseViewModel<N> { var mNavigator: N? = null }