【发布时间】:2021-04-30 22:42:26
【问题描述】:
我正在构建一个具有 MainActivity 和几个片段的 android 应用程序。我为每个片段使用 ViewModel 和 ViewModelFactory。我需要创建一个将执行网络请求的函数,并希望在其中一个片段中使用它,这样我就可以向用户显示一个进度条。当用户单击右上角菜单中的按钮时,我还想从覆盖函数 onOptionsItemSelected 中的 MainActivity 访问此函数。从这个按钮调用时,一切都应该在后台,在任务完成之前不需要向用户显示任何内容。
我尝试了两种方法。
- 将函数放在 ViewModel 中。这非常适合从片段调用并且一切正常。但是从 Main 活动调用时,我似乎无法正确引用 ViewModel。
我在 onCreate 之前将它放在 MainActivity 中
private lateinit var syncViewModel: SyncViewModel
这在 onCreate 中
syncViewModel = ViewModelProvider(this).get(SyncViewModel::class.java)
我收到以下错误消息。
java.lang.RuntimeException:无法启动活动 ComponentInfo java.lang.RuntimeException:无法创建 com 类的实例。.._.SyncViewModel
如何从 Activity 访问已经创建的 ViewModel 而不是创建一个?
- 所以我的第二次尝试是将此函数放在一个单独的文件中。然后我可以从 ViewModel 和 MainActivity 访问它。但我找不到更新 ViewModel 中进度条的方法。
在 ViewModel 中我有以下内容,然后这个片段中的 xml 引用了这个 syncProgress 值。
private var _syncProgress = MutableLiveData<Int>()
val syncProgress: LiveData<Int> = _syncProgress
连接这个单独的函数以更新我的 ViewModel 中的值,我缺少什么?
似乎选项#1 是正确的方法,但也许有第三种我不知道的方法会更好! 任何帮助表示赞赏!
更新 1
我的 ViewModel 定义为
class SyncViewModel(
val database: RoomDatabase,
application: Application) : AndroidViewModel(application) {
在片段中作为
// Create an Instance of the ViewModel Factory
val dataSource = RoomDatabase.getDatabase(application)
val viewModelFactory = SyncViewModelFactory(dataSource, application)
private lateinit var syncViewModel: SyncViewModel
syncViewModel = ViewModelProvider(this,viewModelFactory).get(SyncViewModel::class.java)
但我不确定我需要如何修改 MainActivity 中的 SyncViewModel?
【问题讨论】:
标签: android kotlin android-fragments mvvm viewmodel