繁体   English   中英

撰写状态提升中的类型不匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM