要和底层进行交互 那么就必须满足下面的一个调用的结构
    使用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());
    }
    }