You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Java Activity初始化Kotlin ViewModel:Factory.from参数报错求解

解决Java Activity初始化Kotlin ViewModel的"Cannot resolve method 'from(Factory)'"错误

错误原因

ViewModelProvider.Factory.from()方法要求的参数类型是ViewModelInitializer,而非你传入的自定义ViewModelProvider.Factory实例,这是触发报错的核心原因。

解决方案分三种场景:


场景1:ViewModel无自定义构造参数(你的当前场景)

你的QueueViewModel没有自定义构造逻辑,完全不需要手动实现Factory,直接用默认方式初始化即可:

简化后的Kotlin ViewModel代码

class QueueViewModel : ViewModel() {
    // 你的业务逻辑代码
}

Java Activity初始化代码

public abstract class BaseQueueActivity extends BaseScreenActivity implements IModule {

    private QueueViewModel viewModel = new ViewModelProvider(this)
            .get(QueueViewModel.class);
}

场景2:保留自定义Factory实现

如果你确实需要保留自定义的Factory,不需要使用Factory.from(),直接将Factory实例传给ViewModelProvider构造函数即可:

Kotlin ViewModel代码(保留你的Factory)

class QueueViewModel : ViewModel() {   
    companion object {
        val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
            override fun <T : ViewModel> create(
                modelClass: Class<T>,
                extras: CreationExtras
            ): T {
                return super.create(modelClass, extras)
            }
        }
    }
}

修正后的Java Activity代码

public abstract class BaseQueueActivity extends BaseScreenActivity implements IModule {

    private QueueViewModel viewModel = new ViewModelProvider(
            this,
            QueueViewModel.Companion.getFactory()
    ).get(QueueViewModel.class);
}

场景3:使用ViewModelInitializer新API(适合有构造参数的ViewModel)

如果你的QueueViewModel需要构造参数(比如依赖注入),推荐使用ViewModelInitializer配合Factory.from():

Kotlin ViewModel代码

// 假设ViewModel需要依赖SomeDependency
class QueueViewModel(private val dependency: SomeDependency) : ViewModel() {
    companion object {
        // 定义ViewModelInitializer
        val initializer = ViewModelInitializer(QueueViewModel::class.java) { extras ->
            // 从CreationExtras中获取依赖(示例从Application中获取)
            val app = extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY] as MyApplication
            QueueViewModel(app.getSomeDependency())
        }
    }
}

Java Activity初始化代码

public abstract class BaseQueueActivity extends BaseScreenActivity implements IModule {

    private QueueViewModel viewModel = new ViewModelProvider(
            this,
            ViewModelProvider.Factory.from(QueueViewModel.Companion.getInitializer())
    ).get(QueueViewModel.class);
}

内容的提问来源于stack exchange,提问作者Sk1X1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:52:50