要和底层进行交互 那么就必须满足下面的一个调用的结构
使用fragment来调用viewmodel相关方法
在viewmodel中你可以操作其中的属性 他的属性采用某种数据结构之后可以实时的刷新在页面上
在viewmodel 中你可以写一些方法,这些方法可以用于操作属性 在页面形成交互
也可以声明一些方法,这些方法中可以调用service层
service层的作用就是能够组装一些在viewmodel中传入的数据 然后在service层中调用相应的方法 这些方法就能起到和本地方法交互的功能
使用登录的功能举个例子:
/点击登录按钮的时候 会回调下面这个函数/
binding.buttonConfirm.setOnClickListener {
if (viewModel.confirm()) {
findNavController().navigate(R.id.sellerLoginFragment)
}
}
在这个函数中会调用 viewModel.confirm() 这个方法
/调用底层的登录/
_fun confirm(): Boolean {
val response = terminalLoginService.terminalLogin(_keyPin._value!!)
}
调用了service层中的方法 得到的结果和页面进行交互
通常情况下Service层都这样定义:
@ActivityScoped
class TerminalLoginService @Inject constructor() {
_/终端登录/
_fun terminalLogin(pinCode: String): PosResult<*>? {
return BetwinNativeWrapper.wrapper2(
“terminalLogin”, TerminalLoginInputData(
pinCode
)
)
}
}
可以看到实际上调用的是 BetwinNativeWrapper中的 wrapper2方法
这个方法传递的是两个参数
第一个是 调用的方法名
第二个事调用的实际传递的参数
在service层 写调用本地的方法suspend fun queryTicket(lotteryPassword: String,lotterySn: String,queryType: Int): PosResult<*>?{
return BetwinNativeWrapper.wrapper2(
“queryTicket”, CashPrizeInputData(
lotteryPassword,
lotterySn,
queryType
)
)
}
在wrapper2方法里面传入方法名和传入的参数的数据体 数据体一般是需要自己再封装一层
需要在register.h中注册一下
假如你相应的方法所在的写在payTicket.h文件中
那么你在register.h文件上需要做一个引用 #include “payTicket.h”
if (readValue[“methodName”] == “queryTicket”) {
return env->NewStringUTF(
queryTicket(env, obj, readValue[“requestData”].toStyledString(),
readValue[“methodName”].toStyledString()).c_str());
}
}