向@Composable注入ViewModel

10

我有一个用于个人资料界面的viewModel。

@Composable
fun ProfileScreen() {
    val viewModel: ProfileViewModel = viewModel()
    ...
}

每次调用ProfileScreen时,都会创建一个新的viewModel实例。如何为我的ProfileScreen创建一个唯一的viewModel实例?我尝试使用https://insert-koin.io/docs/reference/koin-android/compose/中提供的注入viewModel的方法,但是当我尝试使用以下代码时:
val viewModel: ProfileViewModel = viewModel()
Android Studio会报错。
4个回答

3

或者使用remember()函数,在重新组合时保存实例视图模型。

@Composable
fun ProfileScreen() {
    val viewModel = remember { ProfileViewModel() }
    ...
}

另外,rememberSaveable 允许在重新创建活动时保存状态(也称为数据类)。

当我尝试它时,我得到了一个来自remember{}的错误:remember调用不应返回Unit,类型不匹配。 要求: ProfileViewModel 已找到: 单位我应该在哪里定义我的ProfileViewModel()类? - Wafi_ck
1
通过调用 remember,它将在重新组合时保留,但如果设备方向更改,则不会保留。它将像普通类一样在当前组合中保留,而不是像典型的Android viewModel。 - ShadeToD
1
如果使用Compose Navigation或Fragments,并且ProfileScreen在后台堆栈中(或者进行任何其他配置更改,如分屏、暗模式切换等),则“remember”也无法存活,而不仅仅是方向更改。 - Sebas LG
这是一个不好的模式。 - ShadeToD

3

当你销毁可组合项时,viewModel也会被销毁,它可以在重新组合时幸存下来,但是一旦可组合项被销毁,viewModel也会被销毁。

你可以在一个比ProfileScreen组件寿命更长的作用域中创建viewModel,然后将其作为参数传递给ProfileScreen

像这样的做法应该可以解决问题。

@Composable 
fun MainScreen() {
     val vModel : ProfileViewModel = viewModel()
     ....
     ProfileScreen(vModel)
}

3
如果您想使用Koin将您的视图模型注入到组合中,您应该按照文档中所描述的方式操作。
getViewModel() - fetch instance

通过调用该方法,Koin将搜索该视图模型并提供一个实例。

下面是在我的应用程序中注入视图模型的示例。

fun ManualControlScreen(
  onDrawerClick: () -> Unit,
  viewModel: ManualControlViewModel = getViewModel<ManualControlViewModel>()
) {
   // Your composable UI
}

0

试试这个:

@Composable
fun HomeScreen(viewModel: PokemonViewModel = koinViewModel()) {
}

build.gradle(:app)

def koin_version = '3.3.2'
implementation "io.insert-koin:koin-core:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version"
implementation 'io.insert-koin:koin-androidx-compose:3.4.1'

SOURCE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接