[英]Get the same instance of ViewModel in Fragment which is defined in Activity with parameter
[英]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
implementation 'androidx.fragment:fragment-ktx:1.1.0'
// 獲取Activity或Fragment 中的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.