我想编写一些应用程序,让一些事情按计划进行。
每隔几分钟轮询一次 URL 进行更新似乎是一个相当常见的用例。不过,在这种特殊情况下,我只是想实现一个时钟。
这有效:
@Composable
fun App() {
var ticks by remember { mutableStateOf(0) }
// Not 100% happy about this unused variable either
val timer = remember {
Timer().apply {
val task = object : TimerTask() {
override fun run() {
ticks++
}
}
scheduleAtFixedRate(task, 1000L, 1000L)
}
}
MaterialTheme {
Text(
// A real application would format this number properly,
// but that's a different question
text = "$ticks"
)
}
}
Run Code Online (Sandbox Code Playgroud)
但我必须导入java.util.Timer
,所以它不会是可移植的。
Jetpack Compose …
timer kotlin android-jetpack-compose compose-desktop compose-multiplatform
我正在使用桌面撰写编写桌面应用程序。但无法找到任何关于如何使用 web-view 的建议,就像我们应该使用的 android 中一样。
对于桌面应用程序,我们无法使用 android web-view 任何帮助和建议将不胜感激。
在桌面上使用Kotlin compose时如何从硬盘加载图像?
我正在尝试使用.svg
(矢量文件)来显示图像,但我被卡住了,无法做到这一点。有什么办法可以使用它,我尝试像这样使用它
Image(imageFromResource("svg_file_name.svg"),contentDescription="")
Run Code Online (Sandbox Code Playgroud)
但它会抛出一个错误:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Failed to Image::makeFromEncoded
at org.jetbrains.skija.Image.makeFromEncoded(Image.java:130)
at androidx.compose.ui.graphics.DesktopImageAsset_desktopKt.imageFromResource(DesktopImageAsset.desktop.kt:77)
at ComposableSingletons$MainKt$lambda-1$1.invoke(main.kt:103)
at ComposableSingletons$MainKt$lambda-1$1.invoke(main.kt:98)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:267)
at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:254)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:251)
at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:110)
at androidx.compose.material.CardKt.Card-F-jzlyU(Card.kt:66)
at MainKt.ShowCanvasIsEmpty(main.kt:93)
at MainKt.DisplayMainUI(main.kt:78)
at MainKt$main$1$1.invoke(main.kt:60)
at MainKt$main$1$1.invoke(main.kt:55)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.material.TextKt.ProvideTextStyle(Text.kt:252)
at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81)
at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.material.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:72)
at MainKt$main$1.invoke(main.kt:55)
at MainKt$main$1.invoke(main.kt:53)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.desktop.AppWindow_desktopKt$Window$1$1.invoke(AppWindow.desktop.kt:97)
at …
Run Code Online (Sandbox Code Playgroud) 在 Android 版 Jetpack Compose 中,您可以执行以下操作:
val fontFamily = FontFamily(
Font(
resId = R.font.my_font_400_regular,
weight = FontWeight.W400,
style = FontStyle.Normal
),
Font(
resId = R.font.my_font_400_italic,
weight = FontWeight.W400,
style = FontStyle.Italic
)
)
Run Code Online (Sandbox Code Playgroud)
但对于桌面版,文件结构不同,我无法访问,R.font.my_font_400_regular
因为“R”是 Android 资源功能。
我一直在尝试 Compose for Desktop,并且试图弄清楚 Jetbrain 如何设计Tray
可组合项的样式。我假设这就是他们用来构建 Jetbrains Toolbox 的方法,因为他们写了一篇关于如何将 Toolbox 迁移到 Compose for Desktop 的文章(请参阅此处)。
图像来自 Ubuntu 22;我还没有测试过 Windows 或 Mac。
如何在 Kotlin Compose 桌面中从远程 url 加载图像?
在Android中它使用大肠杆菌作为官方样本
@Composable
fun NetworkImage(
url: String,
modifier: Modifier = Modifier,
contentScale: ContentScale = ContentScale.Crop,
placeholderColor: Color? = MaterialTheme.colors.compositedOnSurface(0.2f)
) {
CoilImage(
data = url,
modifier = modifier,
contentScale = contentScale,
loading = {
if (placeholderColor != null) {
Spacer(
modifier = Modifier
.fillMaxSize()
.background(placeholderColor)
)
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
bu 作为桌面应用程序,不支持 aar。
我有一个TextField
用于搜索查询和一个Button
将执行搜索的查询,结果显示在列中。由于搜索需要几秒钟才能运行,我希望它在按下按钮时执行,而不是在文本更改时执行。
这是一个简化的演示:
Column {
val list = remember { mutableStateListOf<String>() }
val textFieldValue = remember { mutableStateOf(TextFieldValue("")) }
TextField(
value = textFieldValue.value,
onValueChange = { textFieldValue.value = it }
)
Button({
list.clear()
list.addAll(textFieldValue.value.text.split(""))
}) {
Text("Search")
}
list.forEach {
println("test")
Text(it)
}
}
Run Code Online (Sandbox Code Playgroud)
第一次按下按钮后,foreach 循环将在文本更改时运行。即使单击TextField
也会重新运行循环。这不会在文本更改时运行搜索,而是重新呈现结果,这会导致在文本字段中输入时出现故障。
如何防止这种情况发生?
单击按钮时如何在浏览器中打开链接。我正在使用Compose for Desktop。
Button(onClick = {
// What I have to write here..
}) {
Text(
text = "Open a link",
color = Color.Black
)
}
Run Code Online (Sandbox Code Playgroud)
提前致谢。