如何解决活动和视图模型之间的 kotlin 数据共享
我最近开始自学 kotlin 并且正在构建一个应用程序来掌握应用程序的基础知识..如果答案就在某个地方,但我找不到相关的解决方案,我很抱歉。
我有一个 LoginActivity.kt
,它设置了一个 Loginviewmodel
,其中包含一个用于登录结果的实时可变变量
class Loginviewmodel(private val loginRepository: LoginRepository) : viewmodel() {
private val _loginForm = mutablelivedata<LoginFormState>()
val loginFormState: LiveData<LoginFormState> = _loginForm
private val _loginResult = mutablelivedata<LoginResult>()
val loginResult: mutablelivedata<LoginResult> = _loginResult
fun login(email: String,password: String) {
runBlocking {
// do login
}
}
fun loginDataChanged(username: String,password: String) {
// validate login fields
}
private fun isUserNameValid(username: String): Boolean {
// validate username fields
}
// A placeholder password validation check
private fun isPasswordValid(password: String): Boolean {
// validate passwordfields
}
}
到目前为止,viewmodel 一切正常,通过 Model 和 View 与我设置的服务器通信,从而验证用户登录凭据。
成功登录后我运行
private fun updateUiWithUser(loggedInUser: LoggedInUser) {
startActivity(
Intent(
this@LoginActivity,MainActivity::class.java
).putExtra("loggedInUser",loggedInUser)
)
}
设置主要活动
class MainActivity : AppCompatActivity() {
lateinit var loggedInUser : LoggedInUser // ? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loggedInUser = intent.getParcelableExtra("loggedInUser")!!
Log.v("Main auth token",loggedInUser.token)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(
setof(
R.id.navigation_home,R.id.navigation_dashboard,R.id.navigation_notifications
)
)
setupActionBarWithNavController(navController,appBarConfiguration)
navView.setupWithNavController(navController)
}
}
到目前为止,这一切都有效,成功登录后,日志会显示已设置 loginInUser 变量
然后我想从一个视图中访问登录的用户身份验证令牌,该视图将与服务器执行经过身份验证的通信,除非我想不出这样做的方法:/
我的想法是我可以像这样在改造工厂中做MainActivity().loggedInUser.token
这样的事情
fun getAuthorizedRetrofit(): Retrofit {
val authorizationToken = MainActivity().loggedInUser.token
Log.v("retro builder auth",authorizationToken)
val client: OkHttpClient = OkHttpClient.Builder().addInterceptor(object : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest: Request = chain.request().newBuilder()
.addHeader("Authorization","Token ${authorizationToken}")
.build()
return chain.proceed(newRequest)
}
}).build()
return Retrofit.Builder()
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(API.BASE_URL)
.build()
}
当然,此时它正在尝试实例化一个新的 MainActivity
,因此没有启动的登录用户。
我觉得我缺少一些从我的登录存储库访问登录身份验证数据的基本方法,但据我所知,一旦在上下文中不再需要它,它就会丢失?
我是否缺少对如何实例化、处理和访问类的一些关键理解,还是我的方法有错误?如果是后者,我如何让任何可能想要与服务器通信的视图都可以使用用户身份验证凭据?
服务器全部在带有 postgresql 数据库的 django 中设置,所有 api 调用都从具有硬编码身份验证凭据的应用程序中工作,但显然这不是一个可行的解决方案。
我已经尝试为未来的谷歌员工说的详细一些,但如果有什么需要更清楚的请发表评论:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。