IDEA 又出新神器,一套代码适应多端!

来源:架构师专栏

JetBrains 新推出一款基于多端的 UI 调试工具,一套代码适应多端,真的是太棒了,下面分享给大家。

3b7dcce0c1f3dec28714a5906bb33c6c.png

# 前言

该工具是大名鼎鼎的 JetBrains 公司新推出的,名曰:“Jetpack Compose for Web”,官方介绍称此项目基于 Google 现代 UI 工具包 Jetpack Compose,支持使用 Kotlin 编写响应式 Web UI。

Jetpack Compose 是用于构建原生界面的新款 Android 工具包。它可简化并加快 Android 上的界面开发。使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。

ee2b42b938d9f4d1795044de477c7316.png

# UI 代码和预览如下图所示:

c359081c9b26c962e67c9e2336dbfbc2.png

据介绍,Jetpack Compose for Web 可简化并加速 Web 应用的 UI 开发,目标是在 Web、桌面和 Android APP 之间实现 UI 代码共享,一套代码适应多端。目前处于技术预览阶段。

fun greet() = listOf("Hello", "Hallo", "Hola", "Servus").random()


renderComposable("greetingContainer") {
    var greeting by remember { mutableStateOf(greet()) }
    Button(attrs = { onClick { greeting = greet() } }) {
        Text(greeting)
    }
}
Result: Servus

cd67d4b8b9f6694cfad5eb716a598b9d.png

# 使用 Compose for Web 构建用户界面

借助 Compose for Web,开发者通过使用 Kotlin 并应用 Jetpack Compose 的概念和 API 为 Web 构建响应式用户界面,以表达应用程序的状态、行为和逻辑。

# 可组合的 DOM API

  • 通过 DOM 元素和 HTML 标签表达设计和布局

  • 使用类型安全的 HTML DSL 构建 UI 表示形式

  • 通过使用类型安全的 CSS DSL 创建样式表来完全控制应用程序的外观

  • 通过 DOM 子树与其他 JavaScript 库集成

fun main() {
    renderComposable("root") {
        var platform by remember { mutableStateOf("a platform") }
        P {
            Text("Welcome to Compose for $platform! ")
            Button(attrs = { onClick { platform = "Web" } }) {
                Text("...for what?")
            }
        }
        A("https://www.jetbrains.com/lp/compose-web") {
            Text("Learn more!")
        }
    }
}

d772a288993ad382d746794edc5fd32e.gif

# 具有 Web 支持的多平台小部件

通过利用 Kotlin 的 Expect-actual 机制来提供特定于平台的实现,从而使用和构建可在 Android、桌面和 Web 上运行的 Compose 小部件

处于实验性阶段的一组布局原语 (layout primitives) 和API,这些原语和 API 与 Compose for Desktop/Android 的功能相似

# 示例代码

使用 Composable DOM 编写简单的计数器

fun main() {
    val count = mutableStateOf(0)
    renderComposable(rootElementId = "root") {
        Button(attrs = {
            onClick { count.value = count.value - 1 }
        }) {
            Text("-")
        }
        Span(style = { padding(15.px) }) { /* we use inline style here */
            Text("${count.value}")
        }
        Button(attrs = {
            onClick { count.value = count.value + 1 }
        }) {
            Text("+")
        }
    }
}

# 声明和使用样式表

object MyStyleSheet : StyleSheet() {
    val container by style { /* define a class `container` */
        border(1.px, LineStyle.Solid, Color.RGB(255, 0, 0))
    }
}


@Composable
fun MyComponent() {
    Div(attrs = {
        classes(MyStyleSheet.container) /* use `container` class */
    }) {
        Text("Hello world!")
    }
}




fun main() {
    renderComposable(rootElementId = "root") {
        Style(MyStyleSheet) /* mount the stylesheet */
        MyComponent()
    }
}

# 声明和使用 CSS 变量

object MyVariables : CSSVariables {
    val contentBackgroundColor by variable<Color>() /* declare a variable */
}


object MyStyleSheet: StyleSheet() {
    val container by style {
        MyVariables.contentBackgroundColor(Color("blue")) /* set its value */
    }


    val content by style {
        backgroundColor(MyVariables.contentBackgroundColor.value()) /* use it */
    }
}


@Composable
fun MyComponent() {
    Div(attrs = {
        classes(MyStyleSheet.container)
    }) {
        Span(attrs = {
            classes(MyStyleSheet.content)
        }) {
            Text("Hello world!")
        }
    }
}
 
 
 
 
 
 

【热门内容】

SpringBoot 接口快速开发神器(接口可视化界面实现)

Ubuntu 22.04 震撼登场!!!

VPN 的技术原理是什么?

MySQL暴跌

利用注解 + 反射消除重复代码,妙!

公司把自家运营多年的核心系统(智慧系统)完全开源了

Nacos 2.1.0 正式发布!堪称最强!

300多本程序员经典技术书籍高清PDF
加我微信,备注:资料

扫码备注:资料,自动获取
明天见(。・ω・。)ノ♡
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值