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<String> {
        Log.d(TAG,it)
        text_live_data_b.text=it
    })
}
}

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

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

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

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

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

    open class Factory(str:String):ViewModelProvider.Factory{
        private val mStr=str
        override fun <T : ViewModel?> create(modelClass: Class<T>): 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值