fix: Avoid giving away context

This commit is contained in:
AnranYus
2023-10-20 16:02:39 +08:00
parent 25046d22a8
commit d83082211e
2 changed files with 19 additions and 13 deletions
@@ -20,6 +20,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.navigation.NavigationView
import com.google.android.material.snackbar.Snackbar
import com.lsp.view.YandViewApplication
import com.lsp.view.R
import com.lsp.view.activity.BaseActivity
@@ -42,14 +43,10 @@ class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = MainViewModel.provideFactory((application as YandViewApplication).repository, this,this).create(MainViewModel::class.java)
toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
val appbar = findViewById<AppBarLayout>(R.id.appbar)
val nowHeight = appbar.layoutParams.height
appbar.layoutParams.height = (application as YandViewApplication).statusBarHeight()+nowHeight
viewModel = MainViewModel.provideFactory((application as YandViewApplication).repository, this,this).create(MainViewModel::class.java)
//刷新
val refresh =
findViewById<androidx.swiperefreshlayout.widget.SwipeRefreshLayout>(R.id.swipeRefreshLayout)
@@ -57,6 +54,14 @@ class MainActivity : BaseActivity() {
viewModel.uiState.value.isRefreshing.observe(this) {
refresh.isRefreshing = it
}
viewModel.errorMessage.observe(this){
Snackbar.make(refresh,it,Snackbar.LENGTH_SHORT).show()
}
val appbar = findViewById<AppBarLayout>(R.id.appbar)
val nowHeight = appbar.layoutParams.height
appbar.layoutParams.height = (application as YandViewApplication).statusBarHeight()+nowHeight
refresh.setOnRefreshListener {
viewModel.fetchPostByRefresh()
@@ -2,16 +2,15 @@ package com.lsp.view.model
import android.content.Context
import android.os.Bundle
import android.os.Message
import android.widget.Toast
import androidx.lifecycle.AbstractSavedStateViewModelFactory
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.lsp.view.activity.main.PostAdapter
import com.lsp.view.repository.PostRepository
import androidx.savedstate.SavedStateRegistryOwner
import com.lsp.view.repository.bean.YandPost
import com.lsp.view.repository.exception.NetworkErrorException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -21,12 +20,16 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class MainViewModel(private val repository: PostRepository,private val context: Context):ViewModel() {
class MainViewModel(private val repository: PostRepository,context: Context):ViewModel() {
private val _uiState = MutableStateFlow(UiState())
val uiState:StateFlow<UiState> = _uiState.asStateFlow()
private var fetchJob: Job? = null
val adapter = PostAdapter(context)
private val TAG = this::class.java.simpleName
private val _errorMessage = MutableLiveData<String>()
val errorMessage
get() = _errorMessage as LiveData<String>
companion object {
fun provideFactory(
@@ -86,9 +89,7 @@ class MainViewModel(private val repository: PostRepository,private val context:
}
}catch (e:NetworkErrorException){
launch(Dispatchers.Main){
Toast.makeText(context,e.message,Toast.LENGTH_SHORT).show()
}
_errorMessage.postValue(e.message.toString())
}
_uiState.value.isRefreshing.postValue(false)