我有一个android应用程序1 MainActivity.

导航菜单使用可合成文件的列表来启动相应的可合成文件.我们 for each 可组合函数创建了一个类文件,但它只包含两个可组合函数.


package com.example.Scanner.screens

import ... 
    @Composable
    fun Screen1(modifier: Modifier = Modifier) {
        Text(text = "hi")
        }

@Preview(showBackground = true)
@Composable
fun Screen1Preivew() {
    Scanner1Theme {
        Screen1()
    }
}

我想做一个所有这些可组合继承的类.所以我不需要复制粘贴代码.我可能把所有的组合都创建错了,因为我没有看到一个类定义或继承任何东西的方法.

@Composable
fun SystemBroadcastReceiver(
    systemAction: String,
    onSystemEvent: (intent: Intent?) -> Unit
) {
    // Grab the current context in this part of the UI tree
    val context = LocalContext.current

    // Safely use the latest onSystemEvent lambda passed to the function
    val currentOnSystemEvent by rememberUpdatedState(onSystemEvent)

    // If either context or systemAction changes, unregister and register again
    DisposableEffect(context, systemAction) {
        val intentFilter = IntentFilter(systemAction)
        val broadcast = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                currentOnSystemEvent(intent)
            }
        }

        context.registerReceiver(broadcast, intentFilter)

        // When the effect leaves the Composition, remove the callback
        onDispose {
            context.unregisterReceiver(broadcast)
        }
    }
}

可组合的对象看起来不像一个对象,而是一个类之外的函数.

任何帮助将不胜感激.

推荐答案

可组合函数是顶级函数,而不是类,compose不能使用继承.组合物是无状态的,因为没有对象存储在任何地方.这是导致Compose框架开发的核心设计原则之一.State必须被显式存储为State,它由合成使用的快照系统自动观察,或者它必须在合成之外实现(例如,在视图模型中).

alternative to inheritance is composition号.让我们假设您的所有屏幕都包含页眉和页脚:

@Composable
fun Screen1() {
    Column {
        Text(text = "Header")
        Text(text = "Screen1 content")
        Text(text = "Footer")
    }
}

@Composable
fun Screen2() {
    Column {
        Text(text = "Header")
        Text(text = "Screen2 content")
        Text(text = "Footer")
    }
}

你可以在一个单独的组合中提取公共组件,然后像这样组装它,而不是 for each 屏幕重复这个操作:

@Composable
fun Screen1() = Screen {
    Text(text = "Screen1 content")
}

@Composable
fun Screen2() = Screen {
    Text(text = "Screen2 content")
}

@Composable
fun Screen(
    content: @Composable () -> Unit,
) {
    Column {
        Text(text = "Header")
        content()
        Text(text = "Footer")
    }
}

这就是在组合中避免代码重复的方法.

Android相关问答推荐

房间打开创建回调java.nio.channels. OverlappingFilLockResponse

如何完全隐藏的元素堆叠在CardView?

RemoteActivityHelper.startRemoteActivity不适用于Android Wear OS 4模拟器

在不增加父行宽度的情况下添加延迟行或可滚动行

无法在Android Gradle中同步Chaquopy版本

如何在停止和销毁时更改函数中Firebase实时数据库的子项的值我试过了,但这不起作用.请使用Kotlin

每次重启Android时预填入Room数据库

无法将Kotlin序列化添加到Android项目

如何将Unicode符号作为文本居中放置在布局中的按钮(Android XML)中?

我正在创建一个简单的连接四个游戏,我需要一个弹出式窗口当你赢了

使用RecycleView和Diffutils时从列表中删除项目时出现问题

android crashlytics 显示崩溃但不显示我的课程中的位置

AndroidX Media3 迁移指南

是什么导致调用 Firebase 服务器?

当手表与手机断开连接时,有没有办法在我的 Wear OS 应用程序中显示操作系统级别的图标?

Jetpack compose (Glance) 小部件在加载位图图像后不会重新组合

LazyColumn 单选中的状态提升. Jetpack compose

Jetpack compose 未解决的参考错误

协程中的 Job.Cancel 与 Scope.Cancel 有什么区别?

多个项目 react-native android 构建错误