Как перезаписывать значение, передаваемое через ViewModel?
С ViewModel сталкиваюсь впервые, пожалуйста, помогите решите проблему. При первом открытии фрагмента все хорошо, String передается как надо. Но если я закрою фрагмент, а потом открою его снова, в логах видно, что в фрагмент приходит старое значение. И при попытке передать новое значение из активити приложение крашится. Я так понимаю, что нужно как-то обнулять значение imageUri после закрытия фрагмента? Подскажите, пожалуйста, как это сделать?
open class DataModel : ViewModel() {
val imageUri: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
Активити:
class MainActivity : AppCompatActivity() {
private val dataModel: DataModel by viewModels()
private var picture = ""
fun putPictureFromGallery() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.type = "image/*"
if (intent.resolveActivity(packageManager) != null) {
return startActivityForResult(
Intent.createChooser(intent, "put picture"),
Constants.MAIN_REQUEST_CODE
)
}
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val imageUri: Uri?
if (requestCode == Constants.MAIN_REQUEST_CODE && resultCode == RESULT_OK) {
if (data != null) {
imageUri = data.data
picture = imageUri.toString()
contentResolver.takePersistableUriPermission(data.data!!, Intent.FLAG_GRANT_READ_URI_PERMISSION)
if (picture.isNotEmpty()) dataModel.imageUri.value = picture
}
}
super.onActivityResult(requestCode, resultCode, data)
}
}
Фрагмент:
class DetailFragment : Fragment() {
private val dataModel: DataModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
dataModel.imageUri.observe(activity as LifecycleOwner, {
addImage(it)
}) }
private fun initBottomNavigationView() {
binding!!.bnvDetail.setOnItemSelectedListener {
when (it.itemId) {
R.id.addImage -> {
(activity as MainActivity).putPictureFromGallery()
}
}
}
private fun addImage(uri: String) {
uriImages.add(uri) }