Android : Kotlin : MVVM : 为啥 viewModel.onButtonClicked() 会导致应用程序崩溃?
Posted
技术标签:
【中文标题】Android : Kotlin : MVVM : 为啥 viewModel.onButtonClicked() 会导致应用程序崩溃?【英文标题】:Android : Kotlin : MVVM : Why viewModel.onButtonClicked() causes the app crash?Android : Kotlin : MVVM : 为什么 viewModel.onButtonClicked() 会导致应用程序崩溃? 【发布时间】:2020-12-21 07:39:52 【问题描述】:Logcat 消息:
java.lang.IllegalStateException:在视图类 androidx.appcompat 上定义的 android:onClick 属性的父或祖先上下文中找不到方法 @=() -> viewModel.onBtnClicked()(View)。 id 为“按钮”的 widget.AppCompatButton
文件 1:activity_main.xml
<data>
<variable
name="viewModel"
type="com.wingsquare.databindingdemo.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_
android:layout_
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:onClick = "@=() -> viewModel.onBtnClicked()"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
文件 2:MainActivity.kt
类 MainActivity : AppCompatActivity() 覆盖 fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
// val binding = ActivityMainBinding.inflate(layoutInflater)
val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.viewModel = mainViewModel
binding.lifecycleOwner = this
文件 3:MainViewModel.kt
类 MainViewModel : ViewModel()
fun onBtnClicked()
Log.d("MainViewModel", "MainViewModel")
【问题讨论】:
你最后缺少
。
丢失 android:onClick = "@=() -> viewModel.onBtnClicked()"
错字。添加
。请删除问题
【参考方案1】:
Logcat 消息有些误导。 我在几个小时内都面临同样的错误,检查了我认为是根本原因的所有其他内容。但是对于这个特定的错误,您所要做的就是密切关注“”。这是android中数据绑定的缺点之一。很多时候你不会在编译时得到任何错误,如果你这样做了!这没什么用!
另一件要考虑的事情是 '=' in
android:onClick = "@=() -> viewModel.onBtnClicked()"
用于双向绑定。 在这种情况下你不需要它。 你可以阅读它here on android official docs
【讨论】:
我同意@ArMot。这是 Android 中数据绑定的一个缺点。当布局文件变得过于复杂时,很难发现这样的错误。【参考方案2】:android:onClick="@() -> viewModel.onBtnClicked()"
在末尾添加一个括号。 您可能还想删除 @ 后面的等号【讨论】:
以上是关于Android : Kotlin : MVVM : 为啥 viewModel.onButtonClicked() 会导致应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
没有Dagger2的Android Kotlin MVVM结构
Android kotlin 系列讲解(进阶篇)高级项目架构模式 - MVVM
开源100% Kotlin 的 Android Jetpack mvvm 项目!