我有一個 Composable,其中需要由 Composable 本身和呼叫方(使用 Composable 的引數)更新記住的值(偏移量)——我該如何實作呢?
特別是,我有以下一段代碼。我正在談論的值是offset
in NavigableBox
:我既需要能夠通過拖動框來控制它,也需要使用OffsetInputField
作為引數傳遞的值手動設定它。
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Surface {
Box {
var boxOffset by remember { mutableStateOf(Offset.Zero) }
NavigableBox(boxOffset)
OffsetInputField { offset ->
offset.toFloat().let { boxOffset = Offset(it, it) }
}
}
}
}
}
}
@Composable
fun OffsetInputField(onInput: (String) -> Unit) {
var value by remember { mutableStateOf("") }
TextField(
value = value,
onValueChange = { value = it },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Go),
keyboardActions = KeyboardActions(onGo = { onInput(value) })
)
}
@Composable
fun NavigableBox(initOffset: Offset) {
var offset by remember(initOffset) { mutableStateOf(initOffset) }
Box(
modifier = Modifier
.fillMaxSize()
.pointerInput(Unit) { detectTransformGestures { _, pan, _, _ -> offset = pan } }
) {
Box(modifier = Modifier
.size(100.dp)
.offset { IntOffset(offset.x.roundToInt(), offset.y.roundToInt()) }
.background(Color.Blue)
)
}
}
在當前實作中,拖動作業正常,直到一個新值作為OffsetInputField
' 的輸入傳遞——然后框停止回應拖動。我認為這是因為MutableState
包含偏移量的物件在重新計算時發生了變化,并且盒子不再觀察它。
I already tried using unidirectional data flow in NavigableBox
(passing offset
value and onOffsetChange
lambda to it, but then dragging doesn't work as expected: the box just jiggles around its initial position, returning back to it when the gesture stops.
In case anyone interested, I'm developing an app where the draggable box is a map, and the text field is used for searching objects on it: the map is moved to be centered on an object entered.
uj5u.com熱心網友回復:
pointerInput
捕獲內部使用的所有狀態變數。使用 newinitOffset
您正在創建一個新的可變狀態,但pointerInput
會不斷更新舊的參考。
您需要通過將相同的值傳遞給來重新啟動它key
:
pointerInput(initOffset) { /*...*/ }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/438114.html
標籤:android kotlin android-layout android-jetpack-compose