LiveData使用详解

我们将从Lifecycle1.1.1版本讲起,

1. Lifecycle1.1.1

LiveData使用之前我们需要导入一个第三方库
此处存在一个坑我们需要在项目的builder.gradle中添加

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }//此处为添加
    }
}
不添加会出现Failed to resolve: android.arch.lifecycle:extensions:1.1.1

在module中的dependencies中添加

		api  rootProject.ext.dependencies["lifecycle-extensions"]
	    api  rootProject.ext.dependencies["lifecycle-viewmodel"]
	    api  rootProject.ext.dependencies["lifecycle-livedata"]

在config.gradle中添加

 		// ViewModel and LiveData
        "lifecycle-extensions"                 : "android.arch.lifecycle:extensions:1.1.1",
        "lifecycle-viewmodel"                 : "android.arch.lifecycle:viewmodel:1.1.1",
        "lifecycle-livedata"                 : "android.arch.lifecycle:livedata:1.1.1",

此处我遇到的一个问题如果版本是2.0.0那么就会出现,因为support库不支持

ERROR: Failed to resolve: android.arch.lifecycle:extensions:2.0.0

Android 使用步骤:
Activity中代码

class LiveDataBActivity : AppCompatActivity() ,LifecycleOwner{
 private val TAG=javaClass.simpleName
 lateinit var mTestViewModel: TestViewModel
 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_live_data_b)
    setTextViewModel()
}
override fun onResume() {
    super.onResume()
    btn_set_textviewmodel.setOnClickListener {//改变ViewModel的值
        mTestViewModel.getNameEvent().setValue("6666666666666666666666")
    }
}
 fun setTextViewModel(): Unit {
    mTestViewModel=ViewModelProviders.of(this).get(TestViewModel::class.java)
    val nameEvent=mTestViewModel.getNameEvent()
    nameEvent.observe(this, Observer {
        Log.d(TAG,it)
        text_live_data_b.text=it
    })
}
}

存在一个问题:TextViewModel设置的时候获得了Activity的view了,所以需要改进一下
ViewModel的代码

class TestViewModel:ViewModel() {
    private val mNameEvent:MutableLiveData = MutableLiveData()
    fun getNameEvent(): MutableLiveData {
        return mNameEvent
    }
}

如果需要携带参数给TextModel,我们可以利用Factory

class TestViewModel(str:String):ViewModel() {
    private val mNameEvent:MutableLiveData = MutableLiveData()
    private val mStr=str

    fun getNameEvent(): MutableLiveData {
        return mNameEvent
    }
    fun getStr(): String{
        return mStr
    }

    open class Factory(str:String):ViewModelProvider.Factory{
        private val mStr=str
        override fun  create(modelClass: Class): T {
            return TestViewModel(mStr) as T
        }
    }
}

Activity调用

mTestViewModel=ViewModelProviders.of(this,TestViewModel.Factory("888888")).get(TestViewModel::class.java)

疑惑:不是很清楚support库28.0.0中支持的LifeCycle库是什么版本的,无法使用ViewModelProviders.of(),所以我们得再次导入LifeCycle的extensions库
2. Lifecycle2.0.0
目前androidx,能从公版上面获取到的最新版本也就是2.0.0,
官方给的2.2.0APi中讲解到ViewModelProviders.of()将无法使用,故此我们需要使用ViewModelProvider(ViewModelStoreOwner),ViewModelStoreOwner指的是一个Fragment或者FragmentActivity

特别注意的点是使用的支持库是support库最多支持lifecycle1.1.1,androidx才能支持lifecycle2.0.0也支持不到lifecycle2.2.2

你可能感兴趣的:(LiveData使用详解)