Как я могу реализовать нижний лист с помощью BottomBar в составе реактивного ранца

Итак, я пытаюсь достичь:

  • Домашний составной элемент, на котором размещается панель BottomNav Bar (здесь используется каркас)
  • Нижняя панель навигации прикреплена с 3 другими компонентами.
  • У каждого из 3-х составных элементов есть свой ленивый столбец.
  • Каждый элемент в 3 ленивых столбцах имеет значок меню, при нажатии на который открывается нижний лист.

Мне удалось достичь вышеуказанного, заключив каркас внутри ModalBottonSheetLayout с помощью этого ответа здесь: Jetpack Compose Scaffold + Modal Bottom Sheet

Проблема:

  • Цель нижнего листа - показать пункт меню, при нажатии на который он должен удаляться из lazyColumn.
  • поэтому нижний лист должен знать детали элемента, который был нажат, чтобы удалить его

Как я могу этого добиться? Домашний составной объект не имеет никакой информации об элементах внутри ленивых столбцов, присутствующих в размещаемых им составных объектах.

Есть ли другой подход к этому?

1 ответ

В этом случае я бы использовал репозиторий с StateFlow. Этот репозиторий будет одноэлементным, и он будет отвечать за сохранение данных и их удаление. Ваш составной список будет прослушивать изменения состояния, а ваш нижний лист вызовет delete() для удаления выбранного элемента.

      class Repository<T> {
    private val _state = MutableStateFlow<T>(initialState)
    val state: StateFlow<T> = _state

    fun delete(data: T) {
        _state.remove(data)
    }
}

Родитель вашего составного списка должен обеспечивать обратный вызов. Этот обратный вызов должен вызываться, когда пользователь щелкает элемент списка, и этот элемент передается в качестве параметра.

      @Composable
fun DataList(onItemClick(item: T)) {
    // list implementation with onItemCkick as onClick callback
}

При вызове вы можете открыть нижний лист и передать ему элемент.