Slint 1.5:拥抱 Android、改进实时预览并引入 Pythonic Slint

Slint 是一个声明式 GUI 工具包,用于为用 Rust、C++ 或 JavaScript 编写的桌面和嵌入式应用程序构建本机用户界面, 最近 Slint 发布了 1.5 版本,继续拥抱 Android、改进实时预览并引入 Pythonic Slint,同时保持完全的向后兼容性。本次版本升级,通过增强语言表达力,突出 Slint 在 Android 平台上的支持,以及对移动开发者和嵌入式开发人员的吸引力,文本会做详细介绍使读者更容易理解并感受到这一版本的重要性。

如需了解更多信息,请访问 slint.dev/ 或查看源代码:github.com/slint-ui/sl...

使用 Rust 构建 Android 应用

对于移动开发者来说,现在,开发者可以利用 Slint 开发 Android 应用程序了!Slint 是唯一官方支持 Android 的 Rust GUI 工具包,这意味着开发者可以构建纯 Rust 应用程序,并将其部署在 Android 平台上。

对于那些更喜欢使用 Android BSP 而不是嵌入式 Linux 发行版的嵌入式开发人员来说,Slint 在 Android 端口的支持允许开发者在嵌入式 Android 平台上开发和部署 Slint 应用程序。这一举措将极大地扩展了 Slint 的适用范围,使其成为移动开发者和嵌入式开发人员的首选工具之一。

这一版本的发布不仅仅是一次功能上的增强,更是对 Slint 生态系统的积极贡献。也期待着看到开发者们如何利用这些新的功能和支持,创造出更加令人惊叹的移动应用和嵌入式系统。

下图是Android 手机上的能源监视器演示:

Slint 构建 Android 项目

如果要编译 Slint-Android 项目,大概需要如下一些简单的配置:

  1. 安装JDK, Android SDK 和 Android NDK
  2. 配置 JDK,Android SDK 和 Android NDK 环境变量
  3. 添加 Rust 工具链安装器
  4. 安装 cargo-apk

用 Slint 创建 Android 应用,需要新建 lib 项目(即:不是main.rs而是lib.rs), 必须是具有 crate-typecdylib 库。另外,应该在 Cargo.toml 中启用 slint cratebackend-android-activity-05 feature,实际上,在底层,此功能 feature 是借助 android-activity crate 这个 crate 来绑定到 Android NDK 。

Cargo.toml 配置如下:

toml 复制代码
[package]
name = "slint-rs"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
slint = { version = "1.5.0", features = ["backend-android-activity-05"] }

与使用 android-activity crate 的每个应用程序一样,应用程序的入口点是android_main函数,在该函数中,可以调用slint::android::initslint::android::init_with_event_listener

lib.rs代码如下:(不要忘记#[no_mangle]

rust 复制代码
#[no_mangle]
fn android_main(app: slint::android::AndroidApp) {
    slint::android::init(app).unwrap();
    slint::slint!{
        export component MainWindow inherits Window {
            Text { text: "Hello World"; }
        }
    }
    MainWindow::new().unwrap().run().unwrap();
}

要构建和部署 Slint-Android 应用程序,需要添加 Rust 工具链安装器,并安装Cargo-apk (这是一个Cargo子命令,可构建、签名和部署用 Slint-Rust 开发的 Android APK)。

从添加工具链到构建APK用到的命令如下:

rust 复制代码
rustup target add aarch64-linux-android
cargo install cargo-apk
cargo apk run --target aarch64-linux-android --lib

PS:这里特别注意下 Slint 1.5.0 要求 JDK 版本必须高于Java8,否则编译失败。笔者在本地编译老出错,只能给 Slint 官方提 Issue,很快得到官方开发人员回复,通过沟通和测试,定位原因是Java version 太低(官方只在Java9及以上版本做过测试,低版本无法运行,提了bug,修复会随着后续版本发布.....)

PS:请确保您已在开发环境中安装并正确设置了 Android NDK 和 SDK,以便上述命令能够按预期工作。有关如何设置 Android NDK 和 SDK 的详细说明,请参阅Android 开发人员指南ANDROID_HOME需要将环境变量ANDROID_NDK_ROOT设置为正确的路径。

有关更多详细信息,请参阅 Slint Android 文档

改进实时预览功能

Slint 团队持续优化和改进实时预览功能,以加快开发迭代速度。现在,开发者可以通过点击新的设计模式按钮,将新的小部件(Widgets)直接拖放到预览界面上。这项功能不仅在VS Code 扩展中实现,也支持语言服务器协议 (LSP) 的任何其他编辑器,当然还包括 Slint 官方的在线代码编辑器 SlintPad

开始支持 Python

Slint 1.5 版本另一项重大功能是引入对 Python 的支持,快速入门如下:

  1. 将 Slint 从 Git 开发分支添加到你的 Python 项目:pipenv install "git+https://github.com/slint-ui/slint#subdirectory=api/python&egg=slint"

  2. 创建一个 appwindow.slint 文件:

rust 复制代码
import { Button, VerticalBox } from "std-widgets.slint";

export component AppWindow inherits Window {
    in-out property<int> counter: 42;
    callback request-increase-value();
    VerticalBox {
        Text {
            text: "Counter: {root.counter}";
        }
        Button {
            text: "Increase value";
            clicked => {
                root.request-increase-value();
            }
        }
    }
}
  1. 创建一个 main.py 文件,代码如下 :
rust 复制代码
import slint
# This will open an "appwindow.slint" file
import appwindow_slint

class App(appwindow_slint.AppWindow):
    def __init__(self):
        super().__init__()
        self.some_string_property = "Hello World"

    # Subclasses can decorate methods to automatically associate them with Slint callbacks
    @slint.callback
    def request_increase_value(self):
        self.counter = self.counter + 1

app = App()
app.run()
  1. 运行程序: pipenv run python main.py

不过,Slint-Python 仍处于开发的早期阶段(alpha):API 将会发生变化,重要功能仍在开发中,该项目总体上还不完整,作为开发者可以按文档尝试一下,如果遇到问题可以反馈给官方,有关更详细的开发和使用文档,可以查看Slint-Python-API 文档

注1:Slint-Python 要求 Rust 版本至少为 1.70 或更高版本

注2:该项目由 NLNet 资助

其他的优化和错误修复

Slint 1.5 版本还提供了许多新的 API, 并修复了很多错误和 Bug。

  • 使用新border-*-radius属性自定义各个矩形边框。
  • Image 元素现在支持平铺和 9 切片( 9-slice)缩放。
  • 添加了最小化或最大化窗口的功能
  • 新增"flicked"回调对 Flickable 元素中的更改做出反应
  • 添加了将生成的 C++ 代码放入命名空间的选项
  • TextInput 支持撤消/重做(undo/redo)键盘快捷键
  • 使用新的 red/green/blue/alpha 颜色属性来访问 Slint 中的颜色通道(
  • Slint 语言服务器支持文档格式请求。

有关更改的完整列表,请查看ChangeLog

升级到 Slint v1.5

要使用最新版本,可以按照选择的编程语言的说明进行以下操作:

  • Rust 开发人员:运行cargo update 以使您的应用程序保持最新状态。
  • C++ 开发人员:如果您使用FetchContentCMake,请将或 中GIT_TAG的条目更新为 1.5.x 版本的自动跟踪。 CMakeLists.txt``v1.5.0``release/1.5
  • Node.js 开发人员:运行npm update slint-ui以获取package.json最新信息。

总结

Slint 1.5 版本继续做了一系列增量式更新,在保持向后兼容性的同时添加新功能,比如稳定了对 Android 支持、改进实时预览并启动了对 Python API的支持。

如果你是 Slint 新手,可以查看官方提供相关的入门教程。 为了推动 Slint 不断改进和创新,欢迎在官方提供的错误跟踪器论坛聊天中提供反馈、错误报告和遇到的问题。

参考文档

相关推荐
图王大胜27 分钟前
Android SystemUI组件(11)SystemUIVisibility解读
android·framework·systemui·visibility
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio19952 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
黄尚圈圈3 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水4 小时前
简洁之道 - React Hook Form
前端
服装学院的IT男4 小时前
【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-2
android
Arms2064 小时前
android 全面屏最底部栏沉浸式
android
服装学院的IT男5 小时前
【Android 源码分析】Activity生命周期之onStop-1
android
正小安7 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
ChinaDragonDreamer7 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin