如何创建获取参数的Android ViewModel?

问题描述 投票:0回答:1

我正在尝试创建以 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 数字作为参数。 ?

android mvvm viewmodel
1个回答
0
投票

下面的代码可用于创建一个带有需要 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 以供参考)。希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.