首页 > 解决方案 > 如何传递 id 是否正确?我不明白错误?

问题描述

/*****here the Adapter of my list *****/

class CurrencyMenuAdapter(
var viewModel : MainViewModel,
var currencyList: ObservableList<CurrencyRoomItem>) : ObservableRecyclerViewAdapter<CurrencyRoomItem, BaseViewHolder<CurrencyRoomItem>>(currencyList){
private val TAG = "CurrencyMenuAdapter"
private val model = MainViewModel()
override fun onCreateViewHolder(
    parent: ViewGroup,
    viewType: Int
): BaseViewHolder<CurrencyRoomItem> {
    Log.e(TAG, "onCreateViewHolder: 1")
    return Holder(
        ItemcurrencymenuBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
    )
}
override fun onBindViewHolder(
    holder: BaseViewHolder<CurrencyRoomItem>,
    position: Int
) {
    Log.e(TAG, "onCreateViewHolder: 1")
    holder.bind(currencyList[position])


}
inner class Holder(private val binding:ItemcurrencymenuBinding) :
    BaseViewHolder<CurrencyRoomItem>(binding.root) {
    override fun bind(item: CurrencyRoomItem) {
        binding.item = item
        binding.btnCurrency.setOnClickListener{
            viewModel.goToRoom(item.id!!)
            Paper.book().write(Const.SAVE_ID, item.id)


        }
    }
}

} / / / / /************************************************ *************************************************/

/这里是 ViewModel /

类 MainViewModel:BaseViewModel() {

var firstName = ObservableField<String>()
var lastName = ObservableField<String>()
var userEmail = ObservableField<String>()
var phoneNumber = ObservableField<String>()
var listRoom= ObservableArrayList<CurrencyRoomItem>()
lateinit var id :String
private var useCase = GetCurrenciesMenuUseCase()
init {
}
fun goToRoom(groupId:String){
  getNavigator()!!.town(groupId)
}

/视图模型/

/*****这里是活动*****/

类 MainActivity : BaseActivity(), MainNavigator {

private lateinit var model: MainViewModel
private lateinit var alertDialog: AlertDialog
var dialog: Dialog? = null
override fun hideLogoutDialog() {
    alertDialog.dismiss()
}

var loginResponse = ObservableField<LoginResponse>()
override fun town(groupId: String) {

    startActivity(Intent(this@MainActivity, CurrencyRoomActivity::class.java))
    finish()
}

/活动/

/这里是 BaseViewModel /

abstract class BaseViewModel<N> : ViewModel() {
private  var mCompositeDisposable: CompositeDisposable = CompositeDisposable();
private lateinit var mNavigator: WeakReference<N>

fun getNavigator(): N? {
    return mNavigator?.get()
}

fun setNavigator(navigator: N) {
    this.mNavigator = WeakReference(navigator)
}
override fun onCleared() {
    mCompositeDisposable.dispose()
    super.onCleared()
}

fun getCompositeDisposable(): CompositeDisposable {
    return mCompositeDisposable
}

}

/基础视图模型/

/错误/

//这里是errorr 错误

/错误/

标签: javaandroidandroid-layoutkotlinmvvm

解决方案


该错误意味着 mNavigator 在它具有值之前被使用,通过说 lateinit 你“承诺”永远不会出现这种情况。

你在调用 setNavigator 之前调用 getNavigator(你从不调用 setNavigator)

要修复它,您只需在调用 getNavigator 之前调用 setNavigator。这将解决您的具体问题,但 getNavigator 和 setNavigator 似乎有点奇怪,也许考虑在构造函数中初始化它

编辑:

我想您需要传递 MainActivity,因为它将 MainNavigator 扩展到 setNavigator。在这种情况下,只需在 MainActivity 中使用 ViewModel 变量并调用

viewModel.setNavigator(this)

MainActivity 扩展 MainNavigator 和 MainViewModel 扩展 BaseViewModel 以便应该工作


推荐阅读