繁体   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