Swipeable to interfejs API Compose Material, który ułatwia tworzenie komponentów, które można przełączać między stanami, takimi jak dolne arkusze, szuflady czy funkcja przesuwania w celu zamknięcia. Aby lepiej obsługiwać zaawansowane przypadki użycia, takie jak kotwy zależne od rozmiaru komponentu, opublikowaliśmy nową wersję Compose-Foundation 1.6.0-alpha01: AnchoredDraggable. AnchoredDraggable
to interfejs Foundation API do tworzenia przeciąganych komponentów z zakotwiczonymi stanami, takich jak dolne panele, szuflady czy gest przesunięcia w bok, aby zamknąć.
Interfejsy API Material Swipeable zostały wycofane i zastąpione wersją AnchoredDraggable Foundation i zostaną usunięte w przyszłej wersji. Ten przewodnik opisuje, jak przejść z interfejsów API Swipeable na AnchoredDraggable.
Przenoszenie danych z SwipeableState do AnchoredDraggableState
Najpierw sprawdź, czy dane właściciela stanu uległy zmianie. Nie można dziedziczyć funkcji AnchoredDraggableState, a przed zainicjowaniem przesunięcie jest reprezentowane jako Float.NaN.
Zmień stan posiadacza
AnchoredDraggableState to klasa ostateczna, co oznacza, że nie można jej dziedziczyć. Jeśli istniejący komponent dziedziczy z poziomu SwipeableState, zamiast dziedziczenia z poziomu AnchoredDraggableState zaktualizuj element stanu, aby zawierał odwołanie do AnchoredDraggableState:
Przesuwne
class MySwitchState: SwipeableState()
AnchoredDraggable
class MySwitchState {
    private val anchoredDraggableState = AnchoredDraggableState(...)
}
Twój stan nie dziedziczy już z poziomu SwipeableState, więc musisz samodzielnie udostępnić interfejsy API. Najpopularniejsze interfejsy API, z których możesz korzystać, to offset, progress, currentValue i targetValue.
Dostęp do przesunięcia
W przeciwieństwie do Swipeable stan offset w AnchoredDraggableState ma wartość Float.NaN przed zainicjowaniem. W AnchoredDraggable reklamy zakotwiczone można przekazywać do konstruktora AnchoredDraggableState lub aktualizować za pomocą AnchoredDraggableState#updateAnchors. Przekazywanie kotwic do konstruktora AnchoredDraggableState powoduje natychmiastowe inicjowanie przesunięcia.
Jeśli kotwice zależą od układu lub mogą się zmienić, użyj AnchoredDraggableState#updateAnchors, aby uniknąć odtwarzania stanu po zmianie kotwicy.
Jeśli użyjesz updateAnchors, przesunięcie będzie wynosić Float.NaN, zanim przekaziesz kotwy do updateAnchors. Aby uniknąć przypadkowego przekazania Float.NaN do komponentów, użyj wartości AnchoredDraggableState#requireOffset, aby wymagać inicjalizacji przesunięcia podczas odczytu. Pomoże Ci to w wczesnym wykrywaniu niespójności lub możliwych błędów.
@Composable
fun AnchoredDraggableBox() {
    val state = remember { AnchoredDraggableState(...) }
    val density = LocalDensity.current
    val anchors = remember { DraggableAnchors { ... } }
    SideEffect {
        state.updateAnchors(anchors)
    }
    Box(
        Modifier.offset { IntOffset(x = state.requireOffset(), y = 0) }
    }
}
Przenoszenie danych z Modifier.swipeable do Modifier.anchoredDraggable
Modifier.anchoredDraggable() zastępuje Modifier.swipeable. Niektóre parametry Modifier.swipeable() zostały przeniesione bezpośrednio do AnchoredDraggableState, jak opisano w następnych sekcjach.
Zdefiniuj kotwy
Określ kotwy za pomocą metody konstruktora DraggableAnchors. Następnie prześlij je do konstruktora AnchoredDraggableState#updateAnchors lub AnchoredDraggableState:
Konstruktor
enum class DragValue { Start, Center, End }
@Composable
fun AnchoredDraggableBox() {
    val anchors = DraggableAnchors {
        Start at -100.dp.toPx()
        Center at 0f
        End at 100.dp.toPx()
    }
    val state = remember {
        AnchoredDraggableState(anchors = anchors)
    }
    Box(
        Modifier.offset { IntOffset(x = state.requireOffset(), y = 0) }
    )
}
updateAnchors
enum class DragValue { Start, Center, End }
@Composable
fun AnchoredDraggableBox() {
    val state = remember { AnchoredDraggableState(...) }
    val density = LocalDensity.current
    val anchors = with (density) {
        DraggableAnchors {
            Start at -100.dp.toPx()
            Center at 0f
            End at 100.dp.toPx()
        }
    }
    SideEffect {
        state.updateAnchors(anchors)
    }
    Box(
        Modifier.offset { IntOffset(x = state.requireOffset(), y = 0) }
    )
}
Jeśli kotwice są statyczne, przekaż je do konstruktora. Jeśli zależą od układu lub nie są statyczne, użyj funkcji updateAnchors.
Definiowanie progów pozycji
Zmieniono typ i nazwę parametru progi. Zamiast osobnego interfejsu ThresholdConfig funkcja AnchoredDraggableState ma parametr positionalThreshold, który przyjmuje funkcję lambda zwracającą pozycję progu. Na przykład próg pozycji 50% może być wyrażony w ten sposób:
val anchoredDraggableState = AnchoredDraggableState(
    positionalThreshold = { distance -> distance * 0.5f },
    ...
)
Próg pozycyjny 56dp może być wyrażony w ten sposób:
val density = LocalDensity.current
val anchoredDraggableState = AnchoredDraggableState(
    positionalThreshold = { with(density) { 56.dp.toPx() } },
    ...
)
Zdefiniuj progi prędkości
Próg prędkości jest też przekazywany do konstruktora AnchoredDraggableState, a także wyrażany jako lambda:
val density = LocalDensity.current
val anchoredDraggableState = AnchoredDraggableState(
    velocityThreshold = { with(density) { 125.dp.toPx() } },
    ...
)
Zmiany w interfejsie API
Poniżej znajdziesz przegląd zmian w interfejsie API.
AnchoredDraggableState
| 
 | 
 | 
|---|---|
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | Nie dotyczy | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
Modifier.anchoredDraggable
| 
 | 
 | 
|---|---|
| 
 | 
 | 
| 
 | 
 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | Przekazana do konstruktora  | 
| 
 | Jeszcze nieobsługiwane. Najnowsze informacje znajdziesz w problemie b/288084801. | 
| 
 | Przekazano do konstruktora  | 
