簡體   English   中英

如何在 2020/21 的活動中獲取 ViewModel 的實例?

[英]How to get an Instance of ViewModel in activity in 2020/21?

我是 mvvm 模式的新手。 我為主要活動創建了一個 ViewModel。 現在我想在主活動中獲取 ViewModel 的一個實例。

Stackoverflow 上的大多數教程和答案都建議使用ViewModelProviders.of(... ,但已棄用。

因此,根據stackoverflow上的這個問題: ViewModelProviders is deprecated in 1.1.0 main activity in onCreate,我執行以下操作(我可以發誓我已經運行了它): mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

但是,我收到一個錯誤消息,告訴我沒有找到合適的構造函數。

error: no suitable constructor found for ViewModelProvider(MainActivity)

或者,為了明確說明,MainActivity 應該是 ViewModelStoreOwner,我創建了一個變量ViewModelStoreOwner vmso = this; 並將該變量放入構造函數中,如下所示: mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);

您應該將 gradle 文件更新為:

實現 'androidx.lifecycle:lifecycle-extensions:2.2.0'

由於此更改,您可以將 Activity 傳遞給您提到的構造函數:

mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

在您的應用程序中使用Fragment-ktx libr ,您可以獲得如下所示的 viewModel

首先將 Gradle 文件更新為 app -> build.gradle

implementation 'androidx.fragment:fragment-ktx:1.1.0'

// 獲取ActivityFragment 中的ViewModel as

private val viewModel: MainActivityViewModel by viewModels()

// 如果你想在ChildFragment 中獲得相同的ViewModel實例

 private val viewModel: MainActivityViewModel by viewModels(
    ownerProducer = { requireParentFragment() }
)

在活動中val viewModel by viewModels<TheViewModel>()使用val viewModel by viewModels<TheViewModel>()在片段中val viewModel by activityViewModels<TheViewModel>()使用val viewModel by viewModels<TheViewModel>()從活動中獲取相同的視圖模型(因此共享視圖模型)。

這是現在androidx一部分

目前,唯一對我有用的是使用: MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);

但是,我仍然感謝任何建議,如何使用new ViewModelProvider(this).get(MainActivityViewModel.class);

以新方式獲取 ViewModel

MainActivityViewModel mainActivityViewModel;
    mainActivityViewModel= new ViewModelProvider(this).get(MainActivityViewModel.class);

重復的問題,已經在這里回答

簡單替換:

這個:

boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)

有了這個:

boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)

您可以使用ViewModelFactory

val viewModelFactory = VMFactory(requireActivity().application)
viewModel= ViewModelProvider(requireActivity(),viewModelFactory).get(MainViewModel::class.java)

虛擬機工廠代碼:

class VMFactory(application: Application) : ViewModelProvider.NewInstanceFactory() {

    val _application: Application=application

    @NonNull
    override fun <T : ViewModel?> create(@NonNull modelClass: Class<T>): T {
            return  MainViewModel(_application) as T
    }
}

請注意,這里我的MainViewModel擴展了AndroidViewModel ,因此需要 application 作為輸入參數。

我遇到了類似的問題,最后發現我錯過了類定義中的“ extends ViewModel ”,所以它應該是這樣的:

public class ViewModelClass extends ViewModel
{
    // Tracks the score for Team A
    public int scoreTeamA = 0;

    // Tracks the score for Team B
    public int scoreTeamB = 0;
}

ViewModel viewModel = ViewModelProviders.of(this).get(ViewModel.class);

Android 支持庫版本已折舊。 所以你需要確保你導入了Androidx。 並且您需要在 Gradle 文件中實現 androidx 依賴項。

不建議使用“new”關鍵字創建新的 ViewModel 對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM