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

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

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 1.5:拥抱 Android、改进实时预览并引入 Pythonic Slint

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 配置如下:

[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]

#[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用到的命令如下:

rustup target add aarch64-linux-android
cargo install cargo-apk
cargo apk run --target aarch64-linux-android --lib

PS:这里特别注意下 Slint1.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"

  1. 创建一个appwindow.slint文件:
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文件,代码如下 :
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 不断改进和创新,欢迎在官方提供的错误跟踪器论坛聊天中提供反馈、错误报告和遇到的问题。

参考文档