Интеллектуальное приведение к Int невозможно, потому что mViewModel.counter.value является сложным выражением. - PullRequest
1 голос
/ 06 июля 2019

Вот основное занятие

class MainActivity : AppCompatActivity() {

    private lateinit var mViewModel: MainActivityVm
    private lateinit var mTv: TextView

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(findViewById(R.id.toolbar))

        mTv = findViewById(R.id.tv)

        mViewModel =
            ViewModelProviders.of(this)
                .get(MainActivityVm::class.java)

        mViewModel.counter.observe(this, Observer<Int> { counter ->
            mTv.setText(counter.toString())
        })

        fab.setOnClickListener { view ->
            if(null != mViewModel.counter.value)
            {
                mViewModel.counter.value++
            }
        }
    }

    // ...
}

Я пытаюсь увеличить счетчик в модели данных, когда нажимаю на потрясающую кнопку

fab.setOnClickListener { view ->
    if(null != mViewModel.counter.value)
    {
        mViewModel.counter.value++
    }
}

, но получаю ошибку в строке mViewModel.counter.value++

Умное приведение к Int невозможно, потому что mViewModel.counter.value представляет собой сложное выражение

Что означает ошибка?

Вот данныемодель

class MainActivityVm : ViewModel() {
    val counter = MutableLiveData<Int>().apply { postValue(0)}
}

редактировать

Если я закомментирую нулевую проверку

fab.setOnClickListener { view ->
    //if(null != mViewModel.counter.value)
    //{
        mViewModel.counter.value++
    //}
}

Я получаю ошибку

Разрешены только безопасные (?.) Или ненулевые вызовы (!!.) На обнуляемом приемнике типа Int?

edit

с использованиемнулевая проверка с !!

    fab.setOnClickListener { view ->
        if(null != mViewModel.counter.value)
        {
            mViewModel.counter!!.value++
        }
    }

дает начальную ошибку

Умное приведение к Int невозможно, потому что mViewModel.counter.value является сложным выражением

1 Ответ

2 голосов
/ 06 июля 2019

Вам просто нужно использовать метод MutableLiveData # postValue () .

Кроме того, лучше поместить функциональность внутри ViewModel.

Добавьте метод в ViewModel для увеличения счетчика:

class MainActivityViewModel : ViewModel() {
    val counter = MutableLiveData<Int>().apply { postValue(0)}

    public fun incrementCounter() {
        counter.let {
            val currentVal: Int? = it.value
            currentVal?.let { cur ->
                it.postValue(cur + 1)
            }
        }
    }
}

Это также можно записать как:

public fun incrementCounter() {
    val currentVal: Int? = counter.value
    if (currentVal != null)
        counter.postValue(currentVal + 1)
}

Затем просто вызовите этот метод, когдаНажмите FAB:

    fab.setOnClickListener { view ->
        viewModel.incrementCounter()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...