[英]Type mismatch in compose state hoisting
我试图让一个属性在ViewModel
和@Composable
之间绑定。
我收到以下错误
Type mismatch.
Required:String
Found:MutableState<String.Companion>
我不明白我做错了什么。
//Reusable input field
@Composable
fun MyTextField(
value: String,
onValueChange: (String) -> Unit,
placeHolder: String
) {
OutlinedTextField(
value = value,
onValueChange = onValueChange,
placeholder = {Text(placeHolder)},
)
}
// ViewModel
class MyViewModel : ViewModel () {
var MyVariable = mutableStateOf(String)
}
// stateful comp
@Composable
fun MyScreen(
viewModel: MyViewModel = MyViewModel()
) {
MyContent(
myVariable = vm.myVariable,
setMyVariable = { vm.myVariable = it }
)
}
// stateless Comp
@Composable
fun MyContent(
myVariable: String,
setMyVariable: (String) -> Unit
)
{
Column() {
MyTextField(value = myVariable, onValueChange = setMyVariable, placeholder = "Input Something")
Text("Your variable is $myVariable" )
}
您正在将变量初始化为MutableState<T>
类型的数据持有者。
您在问题中发布的内容甚至无法编译,但这是我假设您在实际代码中所做的
var myVar = mutableStateOf ("")
现在, mutableStateOf("")
返回一个MutableState<String>
类型的对象,你在你的方法中传递它。
另一方面,您的方法需要一个String
类型的对象,而不是MutableState<String>
。 因此,您可以从变量中提取值并将其传递,
myVar.value
或者以首选方式进行操作,并使用 kotlin 属性委托。
像这样初始化变量
var myVar by mutableStateOf ("")
by
关键字充当初始化程序的委托,并返回String
值而不是MutableState<T>
。 这会更新并触发重组,就像它是其他对应物一样,但代码更简洁,并将样板代码保持在最低限度。
此外,您似乎对 compose 和 kotlin 还很陌生,因此请考虑采用 Compose 途径来学习基础知识。 只需查看它,第一个官方 Android 开发者链接就会带您到那里。
编辑:最终答案
视图模型
ViewModel{
var v by mutableStateOf ("")
fun setV(v: String) {
this.v = v
}
}
可组合的呼叫站点
MyComposable(
value = viewModel.v
onValueChange = viewModel::setV
)
可组合声明
fun MyComposable (
value: String,
onValueChange: (String) -> Unit
) {
TextField (
value = value
onValueChange = onValueChange
)
}
这是正确的状态提升链接,其中状态变量被正确更新,因此读取良好。 另外,先生,如果您真的通读了文档并参加了代码实验室,您就会知道什么是状态提升。 我是认真的,参加 codelabs(在 Compose 途径中)。 这就是您的问题被多次否决的原因,因为您使用状态提升之类的术语就好像您理解它一样,但是您没有它所提倡的一半实现。
代替
MyContent(
myVariable = vm.myVariable,
setMyVariable = { vm.myVariable = it }
)
和
MyContent(
myVariable = vm.myVariable.value,
setMyVariable = { vm.myVariable.value = it }
)
你需要像这样定义你的变量
val MyVariable = mutableStateOf<String>("initial value here")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.