最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在?Kotlin?中ViewModel?的獲取及使用指南

 更新時(shí)間:2025年10月24日 16:54:40   作者:橙子19911016  
在Kotlin中,by viewModels()和by viewModels{?}都是用來在?Activity?或?Fragment?中獲取?ViewModel?實(shí)例的屬性委托,接下來通過本文給大家介紹在Kotlin中ViewModel的獲取及使用指南,感興趣的朋友跟隨小編一起看看吧

在 Kotlin 中,ViewModel 的獲取

在 Kotlin 中,by viewModels()by viewModels { } 都是用來在 Activity 或 Fragment 中獲取 ViewModel 實(shí)例的屬性委托。它們之間的區(qū)別在于是否傳遞自定義的 ViewModelProvider.Factory

  • by viewModels(): 使用默認(rèn)的 ViewModelProvider.Factory,通常,這個(gè)默認(rèn)工廠會(huì)使用 ViewModel 的無參構(gòu)造函數(shù)來創(chuàng)建 ViewModel 實(shí)例。
    • 如果 ViewModel 沒有參數(shù),或者使用了依賴注入(如 Hilt)來提供 ViewModel,可以使用這種形式;
  • by viewModels {...}: 花括號(hào)內(nèi)是一個(gè) Lambda,用于提供自定義的 ViewModelProvider.Factory。當(dāng) ViewModel 需要參數(shù)時(shí)使用,必須提供自定義的 Factory 來創(chuàng)建 ViewModel 實(shí)例;

使用指南:

  • 如果 ViewModel 不需要外部參數(shù):使用 by viewModel();
  • 如果 ViewModel 需要參數(shù)或依賴:使用 by viewModels { customFactory }
  • 如果使用 Hilt/Dagger 等 DI 框架:使用 by viewModels()(框架自動(dòng)處理);

添加依賴:

dependencies {
    // 必需:ViewModel 核心
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0"
    // 必需:Activity 或 Fragment 的委托支持(二選一或都選)
    implementation "androidx.activity:activity-ktx:1.8.2"        // Activity 中使用
    implementation "androidx.fragment:fragment-ktx:1.6.2"       // Fragment 中使用
}

例如:假設(shè)我們有一個(gè)需要參數(shù)的 ViewModel:

class MyViewModel(private val repository: MyRepository) : ViewModel() {
    // ...
}

那么,在 Activity 或 Fragment 中,我們需要提供一個(gè) Factory 來創(chuàng)建 MyViewModel:

private val viewModel: MyViewModel by viewModels {
    object : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            // 假設(shè)我們已經(jīng)有了MyRepository的實(shí)例
            return MyViewModel(myRepository) as T
        }
    }
}

或者,你可以定義一個(gè) ViewModelFactory 類:

class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return MyViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

然后,在委托屬性中使用:

private val viewModel: MyViewModel by viewModels {
    MyViewModelFactory(myRepository)
}

補(bǔ)充:Kotin- Fragment 獲取 ViewModel 實(shí)例正確方式

Kotin- Fragment 獲取 ViewModel 實(shí)例正確方式

1. 第一種獲取方式:

通常獲取 ViewModel 方法:

 val model : BlankViewModel by lazy{
        ViewModelProvider(this,BlankViewModel.BlankViewModelFactory()).get(BlankViewModel::class.java)
 }
 //該方法已被廢棄:viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

對(duì)應(yīng)的 BlankViewModelFactory 方法

class BlankViewModel : ViewModel() {
    // TODO: Implement the ViewModel
    private val number = MutableLiveData<Int>();
    private var i=0
    fun getNumber() : LiveData<Int>{
        return number
    }
    fun addNumber(){
        i++
        number.value = i
    }
    class BlankViewModelFactory(): ViewModelProvider.Factory{
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            return BlankViewModel() as T
        }
    }
}

當(dāng)我們創(chuàng)建 Fragment 頁面,并將頁面添加到一個(gè) Activity 頁面中時(shí),想要實(shí)現(xiàn)在 Activity 中調(diào)用 ViewModel 中的方法使得 livedata 的數(shù)據(jù)改變,并希望 Fragment 頁面也可以監(jiān)聽到變化,此時(shí)就需要獲取到同一個(gè) ViewModel 實(shí)例,才能保證兩個(gè)頁面的數(shù)據(jù)同時(shí)變化。

首先,在 Activity 中獲取 BlankViewModel ,并通過點(diǎn)擊按鈕調(diào)用其中的 addNumber 方法,讓變量+1

class FragmentActivity : AppCompatActivity() {
    val model : BlankViewModel by lazy{
        ViewModelProvider(this,BlankViewModel.BlankViewModelFactory()).get(BlankViewModel::class.java)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fragment)
        val button = findViewById<Button>(R.id.add).setOnClickListener {
              model.addNumber()
        }
    }
}

第一個(gè) Fragment 頁面:

class LeftFragment : Fragment() {
    val model : BlankViewModel by lazy{
        ViewModelProvider(requireActivity(),BlankViewModel.BlankViewModelFactory()).get(BlankViewModel::class.java)
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.blank_fragment, container, false)
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val left = view.findViewById<TextView>(R.id.left_tv)
        model.getNumber().observe(requireActivity(), Observer {
            Log.d("IT",""+it)
            left.text = it.toString()
        })
    }
}

在獲取 ViewModel 實(shí)例時(shí),ViewModelProvider 中的第一個(gè)參數(shù) ViewModelStoreOwner 對(duì)象傳遞的是requireActivity 方法,這個(gè)方法里就是獲取當(dāng)前的 Activity 實(shí)例 ;如果該位置仍然傳 this ,則獲取的是與 Activity 不同的 ViewModel 實(shí)例,這樣 Activity 點(diǎn)擊按鈕時(shí) Fragment 頁面的數(shù)值并不會(huì)變化。

val model : BlankViewModel by lazy{     
  ViewModelProvider(requireActivity(),BlankViewModel.BlankViewModelFactory()).get(BlankViewModel::class.java)
}

在觀察變化的方法中,也是同樣的道理:

  model.getNumber().observe(requireActivity(), Observer {
            left.text = it.toString()
 })

另一個(gè) Fragment 頁面和它一樣,這里就不添加了。

2. 第二種獲取方式

通過ktx簡化:
添加 ktx 依賴,這里要注意版本,我的 kotlin 版本過低,下載高版本會(huì)報(bào)紅:

implementation "androidx.fragment:fragment-ktx:1.2.5"
implementation "androidx.activity:activity-ktx:1.0.0-alpha03"

在 Activity 頁面中:

//這里省略掉其他部分
val model by viewModels<BlankViewModel>()

在 Fragment 頁面中

//這里省略掉其他部分
val model by activityViewModels<BlankViewModel>()
//這里可以正常傳this
model.getNumber().observe(this, Observer {
            Log.d("IT",""+it)
            left.text = it.toString()
})

以上就是獲取同一 ViewModel 實(shí)例的方法。如有不對(duì),請(qǐng)指正。

到此這篇關(guān)于在 Kotlin 中ViewModel 的獲取及使用指南的文章就介紹到這了,更多相關(guān)Kotlin  ViewModel 獲取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android實(shí)現(xiàn)濾鏡效果ColorMatrix

    Android實(shí)現(xiàn)濾鏡效果ColorMatrix

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)濾鏡效果ColorMatrix,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧

    Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧

    今天小編就為大家分享一篇關(guān)于Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Android 自定義AlertDialog對(duì)話框樣式

    Android 自定義AlertDialog對(duì)話框樣式

    實(shí)際的項(xiàng)目開發(fā)當(dāng)中,經(jīng)常需要根據(jù)實(shí)際的需求來自定義AlertDialog。最近在開發(fā)一個(gè)WIFI連接的功能,點(diǎn)擊WIFI需要彈出自定義密碼輸入框,具體代碼大家參考下本文
    2017-09-09
  • HorizontalScrollView水平滾動(dòng)控件使用方法詳解

    HorizontalScrollView水平滾動(dòng)控件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了HorizontalScrollView水平滾動(dòng)控件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • android編程實(shí)現(xiàn)類似于支付寶余額快速閃動(dòng)效果的方法

    android編程實(shí)現(xiàn)類似于支付寶余額快速閃動(dòng)效果的方法

    這篇文章主要介紹了android編程實(shí)現(xiàn)類似于支付寶余額快速閃動(dòng)效果的方法,涉及Android時(shí)間函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android仿微信圖片上傳帶加號(hào)且超過最大數(shù)隱藏功能

    Android仿微信圖片上傳帶加號(hào)且超過最大數(shù)隱藏功能

    這篇文章給大家分享android仿照微信空間上傳圖片,顯示圖片數(shù)量以及超過最大,上傳按鈕隱藏功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-03-03
  • 舉例講解Android應(yīng)用開發(fā)中OTTO框架的基本使用

    舉例講解Android應(yīng)用開發(fā)中OTTO框架的基本使用

    這篇文章主要介紹了Android應(yīng)用開發(fā)中OTTO框架的基本使用講解,文中舉了創(chuàng)建一個(gè)單例模式的應(yīng)用例子,需要的朋友可以參考下
    2016-02-02
  • Android學(xué)習(xí)筆記(二)之電話撥號(hào)器

    Android學(xué)習(xí)筆記(二)之電話撥號(hào)器

    目前手機(jī)市場上android已經(jīng)具有強(qiáng)大的霸主地位,吸引了很多的追棒者,android學(xué)習(xí)越來越火熱,本文給大家介紹android學(xué)習(xí)筆記(二)之電話撥號(hào)器,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • Android.mk文件使用速通手冊(cè)

    Android.mk文件使用速通手冊(cè)

    本文將簡要介紹 Android.mk 的使用,看完本文,你將學(xué)會(huì)如何將自己的代碼通過 Android.mk 來編譯到工程中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Android Studio 3.6 調(diào)試 smali的全過程

    Android Studio 3.6 調(diào)試 smali的全過程

    這篇文章主要介紹了Android Studio 3.6 調(diào)試 smali, 目前最新版的 Android Studio 利用附加功能調(diào)試 smali 非常方便,具體操作步驟跟隨小編一起看看吧
    2020-02-02

最新評(píng)論

武隆县| 九寨沟县| 团风县| 双辽市| 泽州县| 宁明县| 冷水江市| 应城市| 华蓥市| 新建县| 宁陕县| 苏州市| 江北区| 新昌县| 云南省| 永年县| 平远县| 德州市| 清流县| 陆丰市| 定结县| 贵港市| 梨树县| 同江市| 根河市| 大埔区| 仪陇县| 宁波市| 溧水县| 泉州市| 沁源县| 苍南县| 丽江市| 凉城县| 开远市| 荆州市| 黄骅市| 岳西县| 通海县| 龙岩市| 天峻县|