如何在2020年的活动中获取ViewModel实例?

时间:2020-01-28 16:03:52

标签: android mvvm viewmodel androidx viewmodelproviders

我是mvvm模式的新手。我为主要活动创建了一个ViewModel。现在,我想在主活动中获取ViewModel的实例。

此处有关Stackoverflow的大多数教程和答案建议使用ViewModelProviders.of(...,但已弃用。

所以根据这个关于stackoverflow的问题:ViewModelProviders is deprecated in 1.1.0 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);

9 个答案:

答案 0 :(得分:14)

您应该将gradle文件更新为:

实现'androidx.lifecycle:lifecycle-extensions:2.2.0'

由于此更改,您可以将Activity传递给您提到的构造函数:

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

答案 1 :(得分:4)

在应用中使用Fragment-ktx库,您可以按照以下方式获取viewModel

首先将Gradle文件更新为应用-> build.gradle

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

//在活动片段中以

的形式获取 ViewModel

private val viewModel: MainActivityViewModel by viewModels()

//如果要在 ChildFragment 中获得与

相同的 ViewModel 实例

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

答案 2 :(得分:2)

在“活动”中使用val viewModel by viewModels<TheViewModel>(),在片段中使用val viewModel by activityViewModels<TheViewModel>(),从活动中获取相同的视图模型(因此共享视图模型)。

这是androidx的一部分

答案 3 :(得分:2)

以新方式获取ViewModel

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

答案 4 :(得分:1)

就目前而言,对我来说唯一有用的就是使用: MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);

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

答案 5 :(得分:0)

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

Android支持库版本已弃用。因此,您需要确保导入Androidx。并且您需要在Gradle文件中实现androidx依赖。

不建议使用“ new”关键字创建新的ViewModel对象。

答案 6 :(得分:0)

您可以使用ViewModelFactory

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

VMFactory代码:

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,因此需要应用作为输入参数。

答案 7 :(得分:0)

我遇到了类似的问题,最后发现我错过了类定义中的“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;
}

答案 8 :(得分:-1)

Duplicate question and already answered here

只需替换:

此:

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

与此:

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