小编Dmi*_*tri的帖子

如何在 Jetpack Compose 中处理导航?

在 Jetpack Compose 中,导航应该如何完成?所有(而且不是很多)示例(包括来自 Google 的官方示例)都使用密封类并加载新屏幕以观察当前屏幕的变化。这确实(有点)工作,但不提供导航后台堆栈,并且手机的后退按钮完全不知道,只是关闭应用程序而不是返回上一个屏幕。这是否应该以某种方式与来自 AndroidX 的导航组件融合——但它是基于 XML 的,而 Compose 就是要远离 XML?或者是否有一个全新的导航概念即将到来,可能类似于 SwiftUI(navigationlink 等)?这似乎是最大的障碍之一——因为没有导航,你只能拥有一个玩具应用程序。有人知道这里的路线图吗?

android kotlin android-jetpack android-jetpack-compose

15
推荐指数
3
解决办法
7969
查看次数

添加 Android Jetpack Compose 导航库后,实现 ViewModelProvider.Factory 失败,并从带有“@JvmDefault”的接口继承

我有这个简单的视图模型提供程序工厂代码(从 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 += …

android kotlin android-studio android-jetpack-compose

5
推荐指数
1
解决办法
1826
查看次数

Android Jetpack Compose 尺寸随持续时间变化的动画

如何在 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

5
推荐指数
1
解决办法
4593
查看次数

Android Jetpack Compose 滚动到顶部

在 Jetpack Compose 中,ScrollToTopButton来自哪里?Google 的文档中提到了这一点。令人烦恼的是,他们忽略了提及包裹。我有进口粉底version 1.2.0-alpha08;还尝试了1.2.0-beta02ui 和材料(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:原来它是一个自定义函数(参见答案)。是什么促使文档的作者这样写呢?为什么不直接放按钮呢?叹。

android kotlin android-jetpack-compose

3
推荐指数
1
解决办法
6422
查看次数

Kotlin 多平台中的 CPointer

我找不到任何有关如何在 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)

c kotlin swift kotlin-native kotlin-multiplatform

2
推荐指数
1
解决办法
2434
查看次数

Kotlin 中的作用域函数 - 你如何记住它们的作用?

Kotlin 中的作用域函数在 JetBrain 的 官方文档中有清晰的解释,包括一个非常有用的矩阵,总结了它们之间的主要区别:

\n\n

在此输入图像描述

\n\n

问题是\xe2\x80\xa6 你怎么记得这个?至少对我来说,这是一场斗争。所以我想出了一种技巧,我想在我自己对这个问题的回答中分享它——希望它也对你有用。或者您可以分享一下您自己对这些功能进行全面回忆的方法吗?

\n

android kotlin

2
推荐指数
1
解决办法
982
查看次数