假设我有一些关于 jetpack-compose 内容的活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ScrollableColumn(
modifier = Modifier
.fillMaxSize()
.border(4.dp, Color.Red)
) {
val (text, setText) = remember { mutableStateOf("") }
TextField(
value = text,
onValueChange = setText,
label = {},
modifier = Modifier
.fillMaxWidth()
)
for (i in 0..100) {
Text("Item #$i")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我要启动此活动并专注于 TextField,则会弹出一个软件键盘。
但是,界面不会对此做出反应。ScrollableColumn 的底部边框 ( .border(4.dp, Color.Red)) 以及第 100 项 ( Text("Item #$i"))将不可见。
换言之,软键盘与内容重叠。
我怎样才能让喷气背包 compose 尊重可见区域的变化(由于软件键盘)?
我想在可组合函数的回调中调用一个挂起函数。
suspend fun getLocation(): Location? { /* ... */ }
@Composable
fun F() {
val (location, setLocation) = remember { mutableStateOf<Location?>(null) }
val getLocationOnClick: () -> Unit = {
/* setLocation __MAGIC__ getLocation */
}
Button(onClick = getLocationOnClick) {
Text("detectLocation")
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用 Rx,那么我可以只使用subscribe.
我可以做invokeOnCompletion然后getCompleted,但那个 API 是实验性的。
我不能使用launchInCompositioningetLocationOnClick因为launchInCompositionis@Composable和getLocationOnClickcan not be @Composable。
在常规函数内部获得挂起函数结果的最佳方法是@Composable什么?