在 Jetpack Compose 中,导航应该如何完成?所有(而且不是很多)示例(包括来自 Google 的官方示例)都使用密封类并加载新屏幕以观察当前屏幕的变化。这确实(有点)工作,但不提供导航后台堆栈,并且手机的后退按钮完全不知道,只是关闭应用程序而不是返回上一个屏幕。这是否应该以某种方式与来自 AndroidX 的导航组件融合——但它是基于 XML 的,而 Compose 就是要远离 XML?或者是否有一个全新的导航概念即将到来,可能类似于 SwiftUI(navigationlink 等)?这似乎是最大的障碍之一——因为没有导航,你只能拥有一个玩具应用程序。有人知道这里的路线图吗?
我有这个简单的视图模型提供程序工厂代码(从 Google 的代码示例之一借用),它很高兴地完成并完美编译......
fun <VM : ViewModel> viewModelProviderFactoryOf(
create: () -> VM
): ViewModelProvider.Factory = SimpleFactory(create)
private class SimpleFactory<VM : ViewModel>(
private val create: () -> VM
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val vm = create()
if (modelClass.isInstance(vm)) {
@Suppress("UNCHECKED_CAST")
return vm as T
}
throw IllegalArgumentException("Can not create ViewModel for class: $modelClass")
}
}
Run Code Online (Sandbox Code Playgroud)
...直到我介绍这个库:
实现“androidx.navigation:navigation-compose:2.5.0-rc02”
现在编译突然失败:
仅允许使用 -Xjvm-default 选项从具有“@JvmDefault”成员的接口继承
(错误指向:ViewModelProvider.Factory)
为什么?导航带来了什么?(我确实确认 100% 是导航库导致的,将其删除,错误就消失了)
注意:Q 不是关于如何解决它,编译器明确建议它,添加这些参数 - freeCompilerArgs += …
如何在 Jetpack Compose 中添加内容大小更改动画的持续时间?尝试使用Modifier.animateContentSize()并传递带有持续时间的animationSpec,但它只是突然插入或弹出,没有观察到持续时间。
Column() {
Modifier.animateContentSize
(animationSpec = tween(durationMillis = 5000,
easing = LinearEasing))
if (!isTabInvisible) {
//some content goes here
}
}
Run Code Online (Sandbox Code Playgroud) animation android android-animation kotlin android-jetpack-compose
在 Jetpack Compose 中,ScrollToTopButton
来自哪里?Google 的文档中提到了这一点。令人烦恼的是,他们忽略了提及包裹。我有进口粉底version 1.2.0-alpha08
;还尝试了1.2.0-beta02
ui 和材料(1.1.1)。未找到。(是的,确实在互联网上搜索过这个词,但空手而归)。
implementation "androidx.compose.foundation:foundation:${version}"
implementation "androidx.compose.foundation:foundation-layout:${version}"
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
Run Code Online (Sandbox Code Playgroud)
@Composable
fun MessageList(messages: List<Message>) {
val listState = rememberLazyListState()
// Remember a CoroutineScope to be able to launch
val coroutineScope = rememberCoroutineScope()
LazyColumn(state = listState) {
// ...
}
ScrollToTopButton(
onClick = {
coroutineScope.launch {
// Animate scroll to the first item
listState.animateScrollToItem(index = 0)
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果这不是他们提供的功能,而是建议您创建自己的功能,那么对编写文档的人感到羞耻,它实际上表明是 Compose 提供的功能。
编辑2:原来它是一个自定义函数(参见答案)。是什么促使文档的作者这样写呢?为什么不直接放按钮呢?叹。
我找不到任何有关如何在 Kotlin Multiplatform 中获取 CPointer 的示例,并且现有文档也没有多大帮助。在我的 iOS 源代码集中,我需要构建与以下 Swift 代码等效的 Kotlin(仅包括代码的相关部分):
...(hex: String) {
if hex.hasPrefix("#") {
let start = hex.index(hex.startIndex, offsetBy: 1)
let scanner = Scanner(string: hexColor)
var hexNumber: UInt64 = 0
if scanner.scanHexInt64(&hexNumber) {
r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
....
Run Code Online (Sandbox Code Playgroud)
我遇到问题的具体部分是
扫描仪.scanHexInt64(&hexNumber)
这是 Kotlin 代码和问题
//input to function - hex: String
val scanner = NSScanner(hex)
if (hex.startsWith("#")) {
scanner.scanLocation = 1u
}
var hexNumber : UInt32 = 0u
/*Type mismatch.
Required:
CPointer<UIntVar /* = …
Run Code Online (Sandbox Code Playgroud) Kotlin 中的作用域函数在 JetBrain 的 官方文档中有清晰的解释,包括一个非常有用的矩阵,总结了它们之间的主要区别:
\n\n\n\n问题是\xe2\x80\xa6 你怎么记得这个?至少对我来说,这是一场斗争。所以我想出了一种技巧,我想在我自己对这个问题的回答中分享它——希望它也对你有用。或者您可以分享一下您自己对这些功能进行全面回忆的方法吗?
\n