android - 智能转换为“Int”是不可能的,因为“mViewModel.counter.value”是一个复杂的表达式
问题描述
这是主要活动
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按钮时,我尝试增加数据模型中的计数器
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 类型的可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?
编辑
使用空检查!!
fab.setOnClickListener { view ->
if(null != mViewModel.counter.value)
{
mViewModel.counter!!.value++
}
}
给出初始错误
智能转换为“Int”是不可能的,因为“mViewModel.counter.value”是一个复杂的表达式
解决方案
您只需要使用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()
}
推荐阅读
- android - 通过 kotlin .. 通过 firebase 从数据库读取数据到 RecyclerView 时遇到问题
- ios - 从崩溃报告中调试函数中的崩溃
- symfony - Symfony Flex:覆盖 Twig 的路由路径功能
- .htaccess - 将 example.com 上的每个页面重定向到 example.org
- firebase - React-Native firebase 注册我如何获取用户名
- sql - PostgreSQL null out 重复结果在结果集中
- collections - ReSharper 可以生成正确比较集合成员的相等成员吗?
- ios - Swift如何使用用户ID获取用户
- node.js - 如何在不和谐机器人上设置服务器特定变量?
- c# - DocumentCompleted 中的 WebBrowser 文档为空