gpt4 book ai didi

带有 SavedState 的 AndroidViewModel

转载 作者:行者123 更新时间:2023-12-03 14:15:36 24 4
gpt4 key购买 nike

我需要使用 AndroidViewModel带有应用程序上下文和 SavedStateHandle .我已经将它与应用程序上下文一起使用,但我无法添加 SavedStateHandle给它。

这就是我所拥有的,只有应用程序上下文:

// A1. get ViewModel in Fragment
val viewModel = ViewModelProvider(viewLifecycleOwner).get(MyViewModel::class.java)

// A2. MyViewModel derives from my custom BaseAndroidViewModel
class MyViewModel(application: Application) :BaseAndroidViewModel(application)

// A3. BaseAndroidViewModel in turn derives from AndroidViewModel
open class BaseAndroidViewModel(application: Application) : AndroidViewModel(application)

我假设对于这个问题,这可能会简化为:
// B1. get ViewModel in Fragment
val viewModel = ViewModelProvider(viewLifecycleOwner).get(MyViewModel::class.java)

// B2. BaseAndroidViewModel in turn derives from AndroidViewModel
class MyViewModel(application: Application) : AndroidViewModel(application)

所以,还有一个 SavedStateHandleMyViewModel ,我将如何修改 fragment 中的调用(示例代码中的行 B1)?我是否需要明确调用工厂 SavedStateViewModelFactory ?那究竟会是什么样子? (我还是 Kotlin/Android 的新手,我以前从未在工厂工作过)

最佳答案

编辑:AndroidX-Activity 1.2.0 的最终版本中和 AndroidX-Fragment 1.1.0 ,他们制作了SavedStateViewModelFactory AppCompatActivity/Fragment 中的默认工厂,因此不需要覆盖默认工厂(这是这个答案的后半部分所做的。)

更新然后使用

class MyViewModel(val savedStateHandle: SavedStateHandle): ViewModel()

class MyAndroidViewModel(application: Application, val savedStateHandle: SavedStateHandle): AndroidViewModel(application)

应该只是工作。

原文:

how would I have to modify the call in the fragment (line B1 in the example code) ? Do I need an explicit call to the factory SavedStateViewModelFactory? How exactly would that look like?



在 AndroidX-Activity 1.2.0 中,他们添加了一个名为 getDefaultViewModelProviderFactory() 的新方法。 :

+    @NonNull
+ @Override
+ public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
+ if (getApplication() == null) {
+ throw new IllegalStateException("Your activity is not yet attached to the "
+ + "Application instance. You can't request ViewModel before onCreate call.");
+ }
+ return ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
+ }
+


这意味着如果我有 BaseActivityBaseFragment , 我可以把它换成 SavedStateViewModelFactory来自 viewmodel-savedstate :
class BaseActivity: AppCompatActivity() {
override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory =
SavedStateViewModelFactory(application, this, intent?.extras ?: Bundle())
}

class BaseFragment: Fragment() {
override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory =
SavedStateViewModelFactory(requireActivity().application, this, arguments ?: Bundle())
}

一旦你有了它,你就可以依赖 ViewModel 的自动实例化 SavedStateHandle作为他们的论点之一:
class MyViewModel(val savedStateHandle: SavedStateHandle): ViewModel()

class MyAndroidViewModel(application: Application, val savedStateHandle: SavedStateHandle): AndroidViewModel(application)

注意订单 application, savedStateHandle预计 SavedStateViewModelFactory .

但是,如果您确实需要自定义参数,那么您必须提供 object: AbstractSavedStateViewModelFactory当您调用 ViewModelProvider(viewModelStoreOwner).get(...)方法

关于带有 SavedState 的 AndroidViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61063844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com