android Jetpack-Compose ModalBottomSheetLayout抛出初始状态为“Hidden”的java.lang.IllegalArgumentException

yhqotfr8  于 2023-06-20  发布在  Android
关注(0)|答案(4)|浏览(203)

通过在Compose中使用ModalBottomSheet,我得到了以下问题:
java.lang.IllegalArgumentException:初始值必须具有关联的锚。
我的可组合函数有:

  1. ModalBottomSheetState和CoroutinScope,
  2. ModalBottomSheetLayout,
  3. a脚手架作为底部板材内容。
// 1.
val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
val coroutineScope = rememberCoroutineScope()

// 2. 
ModalBottomSheetLayout(
    sheetContent = {
        /* sheetContent */
    },
    sheetState = sheetState,
    // modifier = Modifier.fillMaxSize() --> it doesn't change the result
) {
    // 3.
    Scaffold {
        /* scaffold content */
    }
}

通过将底部工作表的初始状态设置为ModalBottomSheetValue.Expanded,问题就消失了。请注意,ModalBottomSheetValue.HalfExpanded也会抛出异常,并且没有任何初始值(默认值为Hidden,因此看起来很合理)。
是否有已知的解决方法或正在工作的库版本(我使用的compose版本:1.0.0和我尝试了1.0.0-rc 2)?

更新

经过一些调查,似乎问题是由于工作表内容中的动态内容。我有一个Column/LazyColumn,当数据可用时重新组合。通过具有固定内容,任何ModalBottomSheetValue的问题消失。

修复

对于“null”内容(理解为高度为0 dp的内容),可组合函数可能没有足够的信息来组成模态底表。动态列内容就是这种情况(从没有内容开始,所以height = 0 dp)。
要解决此问题,请在工作表内容层次结构中的某个位置设置最小高度1 dp:

val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
val coroutineScope = rememberCoroutineScope()

ModalBottomSheetLayout(
    sheetContent = {
        Box(modifier.defaultMinSize(minHeight = 1.dp)) {
            /* sheet content */
        }
    },
    sheetState = sheetState,
    // modifier = Modifier.fillMaxSize() --> it doesn't change the result
) {
    Scaffold {
        /* scaffold content */
    }
}
mi7gmzs6

mi7gmzs61#

对于“null”内容(理解为高度为0dp的内容),可组合函数可能没有足够的信息来组成模态底表。动态列内容就是这种情况(从没有内容开始,所以height = 0dp)。
要解决此问题,请在工作表内容层次结构中的某个位置设置最小高度1 dp:

val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
val coroutineScope = rememberCoroutineScope()

ModalBottomSheetLayout(
    sheetContent = {
        Box(modifier.defaultMinSize(minHeight = 1.dp)) {
            /* sheet content */
        }
    },
    sheetState = sheetState,
    // modifier = Modifier.fillMaxSize() --> it doesn't change the result
) {
    Scaffold {
        /* scaffold content */
    }
}
thtygnil

thtygnil2#

您可以在sheetContent中添加Spacer以避免上述预期

sheetContent = {
        Spacer(modifier = Modifier.height(1.dp))
        Box() {
            /* sheet content */
        }
    }
mutmk8jj

mutmk8jj3#

对我来说,批准的解决方案不起作用。
在我的例子中,当我有一个未指定高度的bottomSheet内容(lazyColumn)时,它失败了,我希望bottomSheet在打开它时使用这一行来 Package 内容的高度:

sheetState.animateTo(ModalBottomSheetValue.HalfExpanded)

对我来说,解决方案是将sheetContent Package 为:

Column(Modifier.fillMaxSize()).

我希望这个解决方案可以帮助其他人,这里是伪代码:

val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
    val coroutineScope = rememberCoroutineScope()
    
    ModalBottomSheetLayout(
        sheetContent = {
            Column(modifier.fillMaxSize()) { ------> The solution
                /* sheet content */
            }
        },
        sheetState = sheetState,
       
    ) {
        Scaffold {
            /* scaffold content */
        }
    }
fcg9iug3

fcg9iug34#

此问题已在版本1.4.0-alpha 04中修复
修复了工作表内容为空时ModalBottomSheetLayout会崩溃的问题。ModalBottomSheetLayout现在允许空工作表内容。如果图纸内容为空,则它将仅处于“隐藏”状态。(Ic2288,B/200980998,b/216693030)

相关问题