从Java Activity初始化Kotlin ViewModel:Factory.from参数报错求解
解决Java Activity初始化Kotlin ViewModel的"Cannot resolve method 'from(Factory)'"错误
错误原因
ViewModelProvider.Factory.from()方法要求的参数类型是ViewModelInitializerViewModelProvider.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
相关产品推荐
相关产品推荐

