当前位置: 首页 > 知识库问答 >
问题:

Live Data Observer只调用了一次。再次调用api更新UI时,并不更新服务器端的数据

端木骞尧
2023-03-14

下面是代码

class FragmentA : Fragment(){

    private lateinit var dealerHomeViewModel: DealerHomeViewModel
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_home_dealers, container, false)

        val dealerHomeFactory = DealerHomeFactory(token!!)
        dealerHomeViewModel = ViewModelProvider(this,dealerHomeFactory).get(DealerHomeViewModel::class.java)

      dealerHomeViewModel.getDealerHomeData()
        return view
    }

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
          dealerHomeViewModel.dealerInfoLiveData.observe(viewLifecycleOwner, androidx.lifecycle.Observer {dealerInfo ->
            // Update UI
            tvDealerName.text = dealerInfo.name
        
        })
    }

 override fun onResume() {
        super.onResume()
        dealerHomeViewModel.getDealerHomeData()
    }
}

//=========================== VIEW MODEL ===================================//
class DealerHomeViewModel(val token:String) : ViewModel() {

    var dealerInfoLiveData:LiveData<DealerInfo>

    init {
        dealerInfoLiveData = MutableLiveData()
    }

    fun getDealerHomeData(){
        dealerInfoLiveData = DealerHomeRepo().getDealerHomePageInfo(token)
    }
}

//======================== REPOSITORY ================================//
class DealerHomeRepo {

    fun getDealerHomePageInfo(token:String):LiveData<DealerInfo>{
        val responseLiveData:MutableLiveData<DealerInfo> = MutableLiveData()
        val apiCall: ApiCall? = RetrofitInstance.getRetrofit()?.create(ApiCall::class.java)
        val dealerInfo: Call<DealerInfo>? = apiCall?.getDealerInfo(Constants.BEARER+" "+token,Constants.XML_HTTP)

        dealerInfo?.enqueue(object : Callback<DealerInfo>{
            override fun onFailure(call: Call<DealerInfo>, t: Throwable) {
                Log.d(Constants.TAG,t.toString())
            }

            override fun onResponse(call: Call<DealerInfo>, response: Response<DealerInfo>) {
                if(response.isSuccessful){
                    when(response.body()?.status){
                        Constants.SUCCESS -> {
                            responseLiveData.value = response.body()
                        }

                        Constants.FAIL -> {

                        }
                    }
                }
            }
        })

        return responseLiveData
    }
}

共有1个答案

沈嘉瑞
2023-03-14

我认为您的问题是,每次使用GetDealerHomePageInfo(Token:String方法时都生成一个新的mutableLiveData。

第一次调用GetDealerHomePageInfo(令牌:string)时,您会生成一个MutableLiveData并且在OnViewCreated上观察它之后,它就有一个值。

onResume中,您再次调用GetDealerHomePageInfo(Token:String),它生成一个新的MutableLiveData,以便您的观察者指向旧的。

class DealerHomeViewModel(val token:String) : ViewModel() {
    private val _dealerInfoLiveData:MutableLiveData<DealerInfo> = MutableLiveData()
    val dealerInfoLiveData:LiveData = _dealerInfoLiveData


    fun getDealerHomeData(){
        DealerHomeRepo().getDealerHomePageInfo(token, _dealerInfoLiveData)
    }
}
class DealerHomeRepo{

    fun getDealerHomePageInfo(token:String, liveData: MutableLiveData<DealerInfo>){
        val apiCall: ApiCall? = RetrofitInstance.getRetrofit()?.create(ApiCall::class.java)
        val dealerInfo: Call<DealerInfo>? = apiCall?.getDealerInfo(Constants.BEARER+" "+token,Constants.XML_HTTP)

        dealerInfo?.enqueue(object : Callback<DealerInfo>{
            override fun onFailure(call: Call<DealerInfo>, t: Throwable) {
                Log.d(Constants.TAG,t.toString())
            }

            override fun onResponse(call: Call<DealerInfo>, response: Response<DealerInfo>) {
                if(response.isSuccessful){
                    when(response.body()?.status){
                        Constants.SUCCESS -> {
                            liveData.value = response.body()
                        }

                        Constants.FAIL -> {

                        }
                    }
                }
            }
        })
    }
dealerHomeViewModel.dealerInfoLiveData.observe(viewLifecycleOwner, androidx.lifecycle.Observer {dealerInfo ->
            // Update UI
            tvDealerName.text = dealerInfo.name
        
        })
 类似资料:
  • 问题内容: 下面显示的以下代码会将3个JLabel添加到JFrame中,然后删除3个JLabel。2秒后,它将重新绘制3个JLabel。 我面临的一个小问题是,它正在重新绘制到新的frame(frameTwo)而不是旧的frame(frameOne)。 如何使它重新绘制现有框架而不是重新绘制到新框架? 问题答案: Simpy使用CardLayout来交换视图。 请使用Swing计时器,而不要使用当

  • 我有一个项目使用以下代码调用componentDidMount()上的API服务 我的组件将过滤器从redux存储区传递到API调用。 但是,如果过滤器通过另一个组件发生变化怎么办?我似乎找不到正确的生命周期方法来在发生这种情况时重新调用api。

  • 印度的《公司法》有一些变化。其中值得注意的是,有一项规定,如果公司进行了数字签名,则可以以电子形式维护其登记册。以下几点让我感到困惑: > 记录一旦以数字方式标注日期和签名,不得编辑或更改; 记录应能够根据法案的规定或根据法案制定的规则进行更新,更新日期应能够记录在每次更新中。 想象一下,我们正在对PDF中的表进行数字签名。如果表中最初有2行,并且用户对pdf进行数字签名。现在,我们在pdf中再添

  • 但还是没用。有什么帮助吗

  • 我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非