如何使用Android架构组件实现登录活动架构?

5

我了解如何使用ViewModel、Repositories和Room将数据从数据库传输到屏幕。但是如何使用POST方法实现登录活动呢?我需要从ViewModel或AuthorizationRepository创建LiveData isAuthorized吗?有人能展示一下如何使用Android架构组件的命令方法的示例吗?

1个回答

1
这可以是您的登录类,可能扩展ViewModel,因此它在配置更改时保持活动状态:
 class LoginClass
    {
        var loginEvent = SingleLiveEvent<LoginEvent>()
        fun startLogin(user: String, password: String)
        {
            loginEvent.value= LoginEvent(LoginStatus.LoginStart,null,null)
            launch(UI) { 
                try{
                    bg{
                        //do login process
                    }.await()
                    loginEvent.value= LoginEvent(LoginStatus.LoginOk,null,null)
                }
                catch (error: Exception){
                    loginEvent.value= LoginEvent(LoginStatus.LoginFailed,error.message,null)
                }
            }
        }
        data class LoginEvent(var loginStatus: LoginStatus, var errorMessage: String?, var loginExtraData: Any?) 
        enum class LoginStatus
        {
            LoginStart,
            LoginOk,
            LoginFailed
        }
    }

您可以观察登录状态,以便根据需要更改用户界面:
val myLoginClass = LoginClass()
myLoginClass.loginEvent.observe(this@LifecycleOwner, Observer {
    if(it==null)
        return@Observer
    when(it.loginStatus)
    {

        LoginClass.LoginStatus.LoginStart -> {
            //show indeterinate progress bar, disable inputs, etc
        }
        LoginClass.LoginStatus.LoginOk -> {
            //go to logged in activity
        }

        LoginClass.LoginStatus.LoginFailed -> {
            //show login failed toast, hide progress bar, enable input, etc
        }
    }
})

要开始登录,只需调用您的类的登录方法:

loginButton.onClick {
    myLoginClass.startLogin("user", "password")
}

从逻辑上讲,你需要更多的东西,但你可以把它当作一个框架来使用。

SingleLiveEvent 可以在这里找到: https://github.com/googlesamples/android-architecture/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接