Kotlin 在ItemViewModel中将域模型与可为空的字段绑定
运行此代码时:Kotlin 在ItemViewModel中将域模型与可为空的字段绑定,kotlin,tornadofx,Kotlin,Tornadofx,运行此代码时: class PersonApp : App(PersonView::class) class Person { var name: String? = null } class PersonModel: ItemViewModel<Person>() { val name = bind(Person::name) } class PersonView : View() { val model: PersonModel by inject()
class PersonApp : App(PersonView::class)
class Person {
var name: String? = null
}
class PersonModel: ItemViewModel<Person>() {
val name = bind(Person::name)
}
class PersonView : View() {
val model: PersonModel by inject()
override val root = form {
textfield(model.name)
}
}
class PersonApp:App(PersonView::class)
班主任{
变量名称:字符串?=null
}
类PersonModel:ItemViewModel(){
val name=bind(Person::name)
}
类PersonView:View(){
val model:PersonModel by inject()
覆盖val root=form{
textfield(model.name)
}
}
将引发以下异常:
Nov 26, 2017 12:18:10 PM tornadofx.DefaultErrorHandler uncaughtException
SEVERE: Uncaught error
kotlin.TypeCastException: null cannot be cast to non-null type javafx.beans.property.Property<N>
at favetelinguis.bfgx.PersonModel$$special$$inlined$bindMutableNullableField$1.invoke(ViewModel.kt:538)
at favetelinguis.bfgx.PersonModel$$special$$inlined$bindMutableNullableField$1.invoke(ViewModel.kt:512)
at favetelinguis.bfgx.PersonModel.<init>(Exeee.kt:27)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at tornadofx.FXKt.find(FX.kt:413)
at favetelinguis.bfgx.Bree$$special$$inlined$inject$1.getValue(Component.kt:954)
at favetelinguis.bfgx.Bree$$special$$inlined$inject$1.getValue(Component.kt:151)
at favetelinguis.bfgx.Bree.getModel(Exeee.kt)
at favetelinguis.bfgx.Bree$root$1.invoke(Exeee.kt:20)
at favetelinguis.bfgx.Bree$root$1.invoke(Exeee.kt:17)
at tornadofx.FXKt.opcr(FX.kt:454)
at tornadofx.FormsKt.form(Forms.kt:23)
at favetelinguis.bfgx.Bree.<init>(Exeee.kt:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at tornadofx.FXKt.find(FX.kt:413)
at tornadofx.FXKt.find$default(FX.kt:398)
at tornadofx.App.start(App.kt:79)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
2017年11月26日下午12:18:10 TornadFX.DefaultErrorHandler uncaughtException
严重:未捕获错误
kotlin.TypeCastException:null不能强制转换为非null类型javafx.beans.property.property
在favetelinguis.bfgx.PersonModel$$special$$inlined$bindMutableNullableField$1.invoke(ViewModel.kt:538)
在favetelinguis.bfgx.PersonModel$$special$$inlined$bindMutableNullableField$1.invoke(ViewModel.kt:512)
在favetelinguis.bfgx.PersonModel.(Exeee.kt:27)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于java.lang.Class.newInstance(Class.java:442)
在FX.FXKt.find(FX.kt:413)
在favetelinguis.bfgx.Bree$$special$$inlined$inject$1.getValue(Component.kt:954)
在favetelinguis.bfgx.Bree$$special$$inlined$inject$1.getValue(Component.kt:151)
在favetelinguis.bfgx.Bree.getModel(Exeee.kt)
在favetelinguis.bfgx.Bree$root$1.invoke(Exeee.kt:20)
在favetelinguis.bfgx.Bree$root$1.invoke(Exeee.kt:17)
在FX.FXKt.opcr(FX.kt:454)
表格kt:23
在favetelinguis.bfgx.Bree(Exeee.kt:19)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于java.lang.Class.newInstance(Class.java:442)
在FX.FXKt.find(FX.kt:413)
在FX.FXKt.find$default(FX.kt:398)
在tornadofx应用程序启动时(应用程序kt:79)
在com.sun.javafx.application.launchempl.lambda$launchApplication1$162(launchempl.java:863)
位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
位于com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:95)
使用域模型的惯用方法是什么?在域模型中,所有初始值都为null,并且要从GUI进行设置?这就是我如何更改上面的代码以使其按预期工作的方法?这应该已经在TornadoFX 1.7.13-SNAPSHOT中工作了,我们对nullable POJO做了一些改进。另一种方法(IMO更好)是在域对象中使用JavaFX属性:
class Person {
val nameProperty = SimpleStringProperty()
var name by nameProperty
}
最后一件要考虑的事情是你没有在你的VIEW模型中设置一个初始项目。请记住,ViewModel本身并不创建项目的实例,您必须手动创建,甚至在创建ViewModel时为其提供默认项目:
class PersonModel : ItemViewModel<Person>(Person()) {
val name = bind(Person::name)
}
class PersonModel:ItemViewModel(Person()){
val name=bind(Person::name)
}
这应该已经在TornadoFX 1.7.13-SNAPSHOT中运行了,我们对nullable POJO做了一些改进。另一种方法(IMO更好)是在域对象中使用JavaFX属性:
class Person {
val nameProperty = SimpleStringProperty()
var name by nameProperty
}
最后一件要考虑的事情是你没有在你的VIEW模型中设置一个初始项目。请记住,ViewModel本身并不创建项目的实例,您必须手动创建,甚至在创建ViewModel时为其提供默认项目:
class PersonModel : ItemViewModel<Person>(Person()) {
val name = bind(Person::name)
}
class PersonModel:ItemViewModel(Person()){
val name=bind(Person::name)
}