我们将从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