我正在尝试创建以 int 数字作为参数的 VM 类,遵循官方网站的更新说明: https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-factories
例如:
public class TargetFragmentVM extends ViewModel {
private int targetId;
public TargetFragmentVM(int targetId) {
this.targetId = targetId;
}
}
这是官方网站上的示例:
imports**
public class MyViewModel extends ViewModel {
public MyViewModel(
MyRepository myRepository,
SavedStateHandle savedStateHandle
) { /* Init ViewModel here */ }
static final ViewModelInitializer<MyViewModel> initializer = new ViewModelInitializer<>(
MyViewModel.class,
creationExtras -> {
MyApplication app = (MyApplication) creationExtras.get(APPLICATION_KEY);
assert app != null;
SavedStateHandle savedStateHandle = createSavedStateHandle(creationExtras);
return new MyViewModel(app.getMyRepository(), savedStateHandle);
}
);
}
---
MyViewModel myViewModel = new ViewModelProvider(
this,
ViewModelProvider.Factory.from(MyViewModel.initializer)
).get(MyViewModel.class);
// Rest of Activity code
}
但是我无法理解如何将它用于我的示例,在这种情况下如何仅传递一些 int 数字作为参数。 ?
下面的代码可用于创建一个带有需要 int 参数的构造函数的视图模型:
viewModel = ViewModelProvider(this, factory = object : Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return if (TargetFragmentVM::class.java.isAssignableFrom(modelClass)) {
try {
modelClass.getConstructor(Int::class.java).newInstance(id)
} catch (e: NoSuchMethodException) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
} catch (e: IllegalAccessException) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
} catch (e: InstantiationException) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
} catch (e: InvocationTargetException) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
}
} else super.create(modelClass)
}
})[TargetFragmentVM::class.java];
您可以使用自定义视图模型工厂并重写它的 create 方法来自行处理创建逻辑。然后,通过反射,由于构造函数需要一个整数参数,因此您可以将整数传递给它(您可以将其保存在片段/活动中的某个位置)。这类似于预定义的视图模型工厂在底层创建视图模型的方式(您可以检查 ViewModelProvider.kt 以供参考)。希望这有帮助。