簡體   English   中英

變量不使用jetpack compose在可組合內部更新

[英]Variable doesn't update inside composable using jetpack compose

我正在嘗試jetpack compose,並有一個基本的可組合文本字段,它接受一個布爾變量進行驗證。 但是它不能正確更新,只能在初始化時工作。

class RegistrationActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {

        var name = "zzz"

        BasicField(
            title = "Last Name",
            value = name,
            onValueChange = {name = it},
            placeholder = "Enter Last Name",
            validation = (name.length>2&&name.contains("zzz"))
        )
    }
}}

可組合:

@Composable
fun BasicField(title: String,
           value: String,
           onValueChange: (String) -> Unit,
           placeholder: String,
            maxLines: Int = 1,
            validation: Boolean ) {

var fieldValue by remember { mutableStateOf(TextFieldValue(value)) }

BasicTextField(
    maxLines = maxLines,
    value = fieldValue,
    onValueChange = {
        fieldValue = it

        if(fieldValue.text.length>5){//this part works
            Log.e("error","valid string")
        }else{
            Log.e("error","invalid string")
        }

        if(validation){//this part doesnt work
            Log.e("error","custom validation works")
        }else{
            Log.e("error","custom validation failed")
        }


    },


) }

我在可組合物中有一個基本驗證,它檢查字符串長度是否有效,但是當邏輯來自外部時它不起作用。 我感謝任何幫助或提示謝謝!

您需要在撰寫中將您的名字作為狀態。 在這里,我們使用了 2 個東西。

  1. name被定義為狀態。 它在作文中被記住。 因此,每當這個可組合函數進入重新組合時,這個名稱將不會被重新分配。

  2. 使用LaunchedEffect執行您的日志語句。 所以 LaunchedEffect 將從一個鍵開始,當它們鍵更改時,此效果將重新啟動。


class RegistrationActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {

                // 1
        val name = remember { mutableStateOf("") }

        BasicField(
            title = "Last Name",
            value = name.value,
            onValueChange = {name.value = it},
            placeholder = "Enter Last Name",
            validation = (name.value.length>2&&name.value.contains("zzz"))
        )
    }
}}


@Composable
fun BasicField(title: String,
           value: String,
           onValueChange: (String) -> Unit,
           placeholder: String,
            maxLines: Int = 1,
            validation: Boolean ) {

    // 2
    LaunchedEffect(key = value) {
        if(value.length>5){
            Log.e("error","valid string")
        }else{
            Log.e("error","invalid string")
        }
        
        if(validation){
            Log.e("error","custom validation works")
        }else{
            Log.e("error","custom validation failed")
        }
    }
    
    BasicTextField(
        maxLines = maxLines,
        value = value,
        onValueChange = {
            onValueChange(it)
            },
    ) 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM