搜索、FocusRequester 未初始化

Van*_*Num 3 search android kotlin android-jetpack android-jetpack-compose

我正在尝试添加一个单击时打开搜索和键盘的按钮。

像这样的东西:

第一状态

下一个状态

但我收到一个错误

   FocusRequester is not initialized. Here are some possible fixes:
   1. Remember the FocusRequester: val focusRequester = remember { FocusRequester() }
   2. Did you forget to add a Modifier.focusRequester() ?
   3. Are you attempting to request focus during composition? Focus requests should be made in
   response to some event. Eg Modifier.clickable { focusRequester.requestFocus() }
Run Code Online (Sandbox Code Playgroud)

我得出的结论是,这是由于动画可见性造成的,因为没有它一切都会正常。也就是说,当按钮和搜索最初都可见时,一切正常。

我想光标无处可立,因为它没有立即更新,但我不知道还能怎么做

我的代码:

topBar = {
                TopAppBar(
                    actions = {
                       // val keyboardController = LocalSoftwareKeyboardController.current //val focusRequester = remember { FocusRequester() }
                        var visibleSearchBar by remember {
                            mutableStateOf(false)
                        }
                        var visiblecurrentSearch by remember {
                            mutableStateOf(true)
                        }
                        val state = remember { mutableStateOf(TextFieldValue("")) }
                        AnimatedVisibility(visible = visiblecurrentSearch) {
                            IconButton(onClick = {
                                visibleSearchBar = true
                                visiblecurrentSearch = false
                                //focusRequester.requestFocus()
                                //keyboardController?.show()
                            }) {
                                Icon(painter = painterResource(id = R.drawable.ic_baseline_search_24),
                                    contentDescription = "search")
                            }
                        }
                        AnimatedVisibility(visible = visibleSearchBar) {
                            TextField(
                                value = state.value,
                                onValueChange = { value ->
                                    state.value = value
                                },
                                enabled = true,
                                shape = RoundedCornerShape(25.dp),
                                modifier = Modifier
                                    //.focusRequester(focusRequester)
                                    .fillMaxWidth()
                                    .padding(end = 10.dp)
                                    .scale(scaleX = 1F, scaleY = 0.9F),
                                textStyle = TextStyle(color = Color.Black),
                                placeholder = {
                                    Text(
                                        text = "Search",
                                        fontSize = 14.sp,
                                    )
                                },
                                keyboardActions = KeyboardActions(
                                    onDone = {
                                        //movie = list
                                    }
                                ),
                                leadingIcon = {
                                    Icon(
                                        Icons.Default.Search,
                                        contentDescription = "",
                                        modifier = Modifier
                                            .size(20.dp)
                                    )
                                },
                                trailingIcon = {
                                    IconButton(
                                        onClick = {
                                            state.value =
                                                TextFieldValue("") =
                                            visibleSearchBar = false
                                            visiblecurrentSearch = true
                                        }
                                    ) {
                                        Icon(
                                            Icons.Default.Close,
                                            contentDescription = "",
                                            modifier = Modifier
                                                .size(20.dp)
                                        )
                                    }

                                },
                                singleLine = true,
                                colors = TextFieldDefaults.textFieldColors(
                                    textColor = Color.Black,
                                    cursorColor = Color.Black,
                                    leadingIconColor = Color.Black,
                                    trailingIconColor = Color.Black,
                                    focusedIndicatorColor = Color.Transparent,
                                    unfocusedIndicatorColor = Color.Transparent,
                                    disabledIndicatorColor = Color.Black
                                )
                            )
                        }


                    },
                    title = {

                    },
                    navigationIcon = {
                        IconButton(onClick = {}) {
                            Icon(painter = painterResource(id = R.drawable.ic_baseline_menu_24),
                                contentDescription = "menu")
                        }
                    },
                    backgroundColor = Color.White,
                    contentColor = Color.Black,
                    elevation = 3.dp
                )
            }
Run Code Online (Sandbox Code Playgroud)

Gab*_*tti 5

您可以使用副作用来请求焦点。
就像是:

    val focusRequester = remember { FocusRequester() }
    LaunchedEffect(visibleSearchBar){
        if (visibleSearchBar)
            focusRequester.requestFocus()
    }

    AnimatedVisibility(visible = visibleSearchBar) {
        TextField(
            //...
            modifier = Modifier
                .focusRequester(focusRequester)
                .fillMaxWidth()
                .padding(end = 10.dp)
                .scale(scaleX = 1F, scaleY = 0.9F),

           //...
         )
Run Code Online (Sandbox Code Playgroud)