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 项目,大概需要如下一些简单的配置:
- 安装JDK, Android SDK 和 Android NDK
- 配置 JDK,Android SDK 和 Android NDK 环境变量
- 添加 Rust 工具链安装器
- 安装 cargo-apk
用 Slint 创建 Android 应用,需要新建 lib 项目(即:不是main.rs
而是lib.rs
), 必须是具有 crate-type
的 cdylib
库。另外,应该在 Cargo.toml 中启用 slint crate
的backend-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::init
或slint::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 的支持,快速入门如下:
-
将 Slint 从 Git 开发分支添加到你的 Python 项目:
pipenv install "git+https://github.com/slint-ui/slint#subdirectory=api/python&egg=slint"
-
创建一个
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();
}
}
}
}
- 创建一个
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()
- 运行程序:
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++ 开发人员:如果您使用
FetchContent
CMake,请将或 中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 不断改进和创新,欢迎在官方提供的错误跟踪器、 论坛和聊天中提供反馈、错误报告和遇到的问题。
参考文档
- Slint 升级公告:slint.dev/blog/slint-...
- Slint 更改日志:github.com/slint-ui/sl...
- Slint Docs:slint.dev/docs
- Slint 文档:slint.dev/releases/1....
- Slint Rust: slint.dev/releases/1....
- Slint Android:slint.dev/snapshots/m...
- Slint-Python:github.com/slint-ui/sl...
- PythonicSlint:nlnet.nl/project/Pyt...
- cargo-apk:github.com/rust-mobile...
- android-activity:github.com/rust-mobile...