我正在尝试在我的Compose应用中实现一个搜索栏。我有一个文本字段,当我在文本字段之外点击时,我希望它失去焦点并隐藏键盘。但是,我无法弄清楚如何实现。我尝试过使用在GitHub上看到的代码,但进行了一些更改。
然而,原始解决方案使用了这部分代码
有什么想法吗?
以下是我的代码:
然而,原始解决方案使用了这部分代码
isHintDisplayed = it != FocusState.Active
,似乎已经过时了。所以我将其更改为isHintDisplayed = it.isFocused != true
,理论上应该能达到同样的效果。如果我回到较旧版本的compose并使用FocusState.Active,则聚焦/取消聚焦就完美工作,但我无法让它与我的代码配合使用。有什么想法吗?
以下是我的代码:
@Composable
fun ListScreen(
navController: NavController
) {
Surface(
color = MaterialTheme.colors.background,
modifier = Modifier.fillMaxSize()
) {
Column {
Spacer(modifier = Modifier.height(20.dp))
Image(
painter = painterResource(id = R.drawable.ic_international_pok_mon_logo),
contentDescription = "Cards",
modifier = Modifier
.fillMaxWidth()
.align(CenterHorizontally)
)
SearchBar(
hint = "Search",
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
}
}
}
}
这里是搜索栏:
@Composable
fun SearchBar(
modifier: Modifier = Modifier,
hint: String = "",
onSearch: (String) -> Unit = {}
) {
var text by remember {
mutableStateOf("")
}
var isHintDisplayed by remember {
mutableStateOf(false)
}
Box(modifier = modifier) {
BasicTextField(
value = text,
onValueChange = {
text = it
onSearch(it)
},
maxLines = 1,
singleLine = true,
textStyle = TextStyle(color = Color.Black),
modifier = Modifier
.fillMaxWidth()
.shadow(5.dp, CircleShape)
.background(Color.White, CircleShape)
.padding(horizontal = 20.dp, vertical = 12.dp)
.onFocusChanged {
isHintDisplayed = !it.isFocused
}
)
if(isHintDisplayed) {
Text(
text = hint,
color = Color.LightGray,
modifier = Modifier
.padding(horizontal = 20.dp, vertical = 12.dp)
)
}
}
}