使用ViewModel在Fragment之間共享數(shù)據(jù)

  • 我們之前在Activity和Fagment之間傳值一般使用構(gòu)造,回調(diào)。等等方式,但是這種存在內(nèi)存泄漏和空構(gòu)造異常,現(xiàn)在官方提供了更友好的ViewModel進(jìn)行傳值,并且可以
    跟隨Activity和Fragment的生命周期,完全解耦

  • 這個(gè)是官方地址:https://developer.android.google.cn/topic/libraries/architecture/viewmodel

  • 需要依賴Fragment的擴(kuò)展函數(shù)庫(kù) implementation "androidx.fragment:fragment-ktx:1.2.5"

  • 我們建立一個(gè)需要傳值的Viemodel類,這里只是簡(jiǎn)單傳遞個(gè)boolean值

package com.example.jitpackdemo.ui.main

import android.content.ClipData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Boolean>()
}
  • 在Mactivity中關(guān)聯(lián)此ViewModel
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        var shareModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, MainFragment.newInstance())
                .commitNow()
        }
        shareModel.selected.value= true
    }
}

可以看到這里我們區(qū)改變了數(shù)值為true

  • Fragment中我們只需要private val model: SharedViewModel by activityViewModels1() 引入剛才我們創(chuàng)建的viewModel
class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel
    private val model: SharedViewModel by activityViewModels1()
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        model.selected.observe(viewLifecycleOwner, Observer {
            Toast.makeText(activity,it.toString(),Toast.LENGTH_SHORT).show()
        })
    }

}

這樣我們就可以在Fragment中正常收到我們從Activity的數(shù)值了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。