用户注销时如何清除视图模型?

问题描述 投票:0回答:2

一旦用户注销并再次登录,观察者就不会观察实时数据。我认为它在某种程度上与视图模型范围有关,因为重新启动应用程序后它会再次观察事物。

视图模型

package com.ashutosh.auth2.ui.viewmodel

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.ashutosh.auth2.models.Data
import com.ashutosh.auth2.models.Profile
import com.ashutosh.auth2.models.RecentLinks
import com.ashutosh.auth2.models.TopLinks
import com.ashutosh.auth2.repository.UserRepository
import com.google.firebase.auth.FirebaseAuth
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class MainViewModel @Inject constructor(
        private val repository: UserRepository,
        private val firebaseAuth: FirebaseAuth
    ) : ViewModel() {
    val  usersLiveData : LiveData<Data>
    get() = repository.data

    private val _response = MutableLiveData<String>()
    val response: LiveData<String> = _response

    init{
        viewModelScope.launch {
            repository.getUsersData()
        }
    }

    fun createLink(app : String , link : String) {
        val recentLink = RecentLinks(link,0,app)
        val topLinks = TopLinks()
        val id = firebaseAuth.currentUser!!.uid
        val data = Data(id.toString(), listOf(recentLink), listOf(topLinks))
        viewModelScope.launch {
            val response = repository.createLink(data)
            if (response.isSuccessful) {
                _response.value = "User created successfully"
            } else {
                _response.value = "Failed to create user"
            }
        }
    }

}

回收商数据类

package com.ashutosh.auth2.ui.fragments

import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.ashutosh.auth2.R
import com.ashutosh.auth2.databinding.FragmentRecentLinkBinding
import com.ashutosh.auth2.ui.viewmodel.MainViewModel
import com.ashutosh.auth2.adapter.tabLayout.RecentLinkAdapter
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class RecentLinkFragment : Fragment() {
    lateinit var binding : FragmentRecentLinkBinding
    lateinit var mainViewMdoel: MainViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_recent_link,container,false)
        mainViewMdoel =ViewModelProvider(this).get(MainViewModel::class.java)
        binding.lifecycleOwner = this
        return binding.root
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mainViewMdoel.usersLiveData.observe(viewLifecycleOwner, Observer {
            binding.recyclerRecentLink.apply {
                adapter = RecentLinkAdapter(it.recent_links,requireContext())
                layoutManager = LinearLayoutManager(context)
            }
        })
    }
}

存储库

package com.ashutosh.auth2.repository

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.ashutosh.auth2.models.Data
import com.ashutosh.auth2.models.Id
import com.ashutosh.auth2.models.Profile
import com.ashutosh.auth2.retrofit.LinkProApi
import com.google.firebase.auth.FirebaseAuth
import com.google.gson.Gson
import okhttp3.ResponseBody
import retrofit2.Response
import javax.inject.Inject

class UserRepository @Inject constructor(
    private val linkProApi: LinkProApi,
    private val firebaseAuth: FirebaseAuth
    ) {
    private val _data = MutableLiveData<Data>()
    val data : LiveData<Data>
    get() = _data

    suspend fun getUsersData() {
        try {
            val result = linkProApi.getLinkData(Id(firebaseAuth.currentUser!!.uid.toString()))
            if (result.isSuccessful && result.body()  != null) {
                var gson = Gson()
                var data : Data = gson.fromJson(result.body()!!.string(),Data::class.java)
                _data.postValue(data)
            }
        } catch (e: Exception) {
            Log.d("data", e.toString())
        }
    }

    suspend fun createLink(data: Data): Response<ResponseBody> {
        return linkProApi.createLink(data)
    }
}

登录和注销

   fun signInWithGoogle(requestCode: Int, data: Intent?) {
        viewModelScope.launch(Dispatchers.IO) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.getResult(ApiException::class.java)
                var editor = sharedPreferences!!.edit()
                editor.putBoolean("isLoggedIn",true)
                editor.apply()
                _isSignedIn.postValue(true)
                _signInResult.postValue(Resource.Success(account))
                firebaseAuthWithGoogle(account)
            } catch (e: ApiException) {
                _signInResult.postValue(Resource.Failure(e))
            }
        }
    }

    fun logout(){
        firebaseAuth.signOut()
        _loginFlow.value = null
        _signupFlow.value = null
        userRepository.clearLiveData()
        var editor = sharedPreferences!!.edit()
        editor.putBoolean("isLoggedIn",false)
        editor.apply()
        
    }

RecentLinkFragment 中的观察者不会观察用户注销并再次登录时的情况。 如果我重新启动应用程序,它就可以正常工作。 请帮忙!!

android kotlin mvvm viewmodel android-livedata
2个回答
0
投票

尝试以下方法。

首先,在MainViewModel中添加一个清除LiveData的方法。

fun clearLiveData() {
    _data.value = null
}

然后,在RecentLinkFragment中调用

clearLiveData
来处理注销。


0
投票

请分享注销/登录代码。

一旦弹出fragment,viewModel也会被移除。

使用“viewLifecycleOwner”观察 LiveData 将一直有效,直到视图被销毁。

© www.soinside.com 2019 - 2024. All rights reserved.