【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui

这篇具有很好参考价值的文章主要介绍了【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui


前言

本次内容接上回《rust原生跨平台GUI框架——iced》,最近突然涌现出多个Rust的UI框架,真实令人兴奋,同时也突出了Rust的勃然生机,我将尽量为大家介绍Rust领域的UI框架,带大家体验Rust领域的好玩意儿。

Frui是一个对开发者相当友好的UI框架,它使得开发者构建用户界面变得简单,并且是一个真正意义上受Flutter启发、用纯Rust写的UI框架。如果你了解Flutter,或者Vue/React的话,学习这些东西将会变得很容易,但是如果你并不了解,还是建议你去学习基础内容,并且推荐一本书《Flutter实战·第二版》,读者可以在Github上自行搜索。本期内容还是老规矩,写个Counter的Demo来看看。

由于Frui现在刚发行第一版,所以要求不是很高,本期内容主要体验其编码方式。


一、新建项目

1. 创建项目

这里依旧还是我们的老规矩,创建一个Counter的Demo项目。

cargo new gui_frui_001

2. 导入idea

使用idea打开刚才创建的项目
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui

3. 引入依赖

Cargo.toml中导入依赖

frui = "0.0.1"

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui

4. 执行案例代码

将以下代码复制到main.rs

#![feature(min_specialization)]
#![feature(type_alias_impl_trait)]

use frui::prelude::*;

#[derive(ViewWidget)]
struct App;

impl ViewWidget for App {
    fn build<'w>(&'w self, _: BuildContext<'w, Self>) -> Self::Widget<'w> {
        Center::child(Text::new("Hello, World!"))
    }
}

fn main() {
    run_app(App);
}

然后idea就会报错
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui
因为我用的是稳定版的Rust,因此一些特性是没有的,所以要安装nightly版本的Rust,直接执行以下代码

rustup toolchain install nightly

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui然后列出当前Rust的版本

rustup toolchain list

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui现在激活nightly版本的编译器

rustup default nightly

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui接下来去项目目录覆盖配置文件

rustup override set nightly

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui此时idea还会提示错误的,这是因为nightly没有源码,插件默认用的stable的源码,所以检查语法出错了,不必管他,直接运行
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui

如果你也运行了下面的窗口,说明你已经配置成功了。rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui

二、实现计数器Demo

1.导入资源

在实现Counter Demo之前,我们需要导入框架所需要的资源,我发现其框架并未打包UI相关的资源,要是和Flutter那样可以直接用Material的UI就太好了,我觉得以后可能会出类似的。

首先需要从Github上的frui-main\examples复制出misc文件夹到我们项目的目录来,
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui

rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui可以看到这个版本目前只提供了按钮和开关,还有State,到现在为止,框架相关的内容都已经导入完毕。

2.编写窗口代码

Frui的代码和Flutter是高度相似的,从编写窗口代码这里就可以看出来。首先要做的就是先定义窗口State,这里我们定义了CrabCounter,并且实现WidgetState,并且给一个整数型的State,特别重要的是一定要写create_state方法,初始化State。

#[derive(ViewWidget)]
struct CrabCounter;

impl WidgetState for CrabCounter {
    type State = isize;

    fn create_state(&self) -> Self::State { 0 }
}

接下来就是要编写窗口,实现窗口逻辑。在这里给Crab Counter实现了ViewWidget特质,其必须要实现一个build方法,返回构建的窗口,其代码如下

impl ViewWidget for CrabCounter {
    fn build<'w>(&'w self, ctx: BuildContext<'w, Self>) -> Self::Widget<'w> {
        Column::builder()
            .space_between(60.0)
            .main_axis_size(MainAxisSize::Max)
            .cross_axis_size(CrossAxisSize::Max)
            .main_axis_alignment(MainAxisAlignment::Center)
            .cross_axis_alignment(CrossAxisAlignment::Center)
            .children((
                Text::new(format!("{} 🦀", *ctx.state()))
                    .size(100.0)
                    .weight(FontWeight::BOLD),
                Row::builder()
                    .space_between(10.0)
                    .children((
                        Button {
                            label: Text::new("+").size(30.),
                            on_click: || *ctx.state_mut() += 1,
                        },
                        Button {
                            label: Text::new("-").size(30.),
                            on_click: || *ctx.state_mut() -= 1,
                        },
                    )),
            ))
    }
}

以上代码的布局是这个样子的
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui要注意的是,Button 至少需要传入两个参数,一个是按钮的标签——Text,当然也可以是Image,目前并不清楚它是否有这个组件了,所以还是按官方的来,直接用Text;一个是点击的回调函数,

3. 运行效果

此时我们运行Counter程序,如果运行没有错误,那应该是下面这个样子的
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,ui上面的Text部分,左边是计次的数字,右边是Rust的吉祥物🦀,下面是两个按钮,一个+,一个-

Rust的吉祥物是🦀,而非图中白色的样子,官方给出的运行结果应该是下面这个样子的
rust gui,一起学Rust,# Rust框架篇,rust,开发语言,flutter,uiRust是支持这种文本的,但是不知道为什么表现出来和官方给的案例是不一样的。


总结

本期学习了另一个由纯Rust写的UI框架——Frui,这是一个对开发者相当友好的框架,借鉴于Flutter,可惜是刚起步的框架,相信其在以后的发展肯定会变得更好。

Frui框架的路子是学习Flutter的,其代码也是高度相似,代码也容易理解,确实做到了对开发人员友好,这是非常值得肯定的,学习过Flutter的人甚至可以直接迁移过来,不需要学习太多的内容,降低了学习成本。但是该项目还处在刚开始阶段,我觉得可以关注一手,该框架如果做完,可能是Rust的主流框架。此外,这个Counter还不支持点关闭按钮来关闭窗口,我觉得这可能是因为没有实现关闭按钮的代码导致的,后续随着该项目的发展,会补齐这部分内容。

比较起上期的UI框架——Iced,其架构思想与Flutter也是高度相似,与Frui不同的是,Iced主要借助于一个Sandbox,但是其编程手法是对开发者比较有好的。在我的体验中,主要遇到的是文档版本错乱,不支持中文,所以导致体验很差。我在别的博主下面看到Iced是支持中文的,但是我加中文就乱码,目前还不清楚是什么问题。

完整代码

counter的完整代码

use frui::prelude::*;

use rand::Rng;

/// This widget will display a different number every time its state is lost.
#[derive(ViewWidget)]
pub struct RandomState;

impl WidgetState for RandomState {
    type State = usize;

    fn create_state<'a>(&'a self) -> Self::State {
        rand::thread_rng().gen()
    }
}

impl ViewWidget for RandomState {
    fn build<'w>(&'w self, ctx: BuildContext<'w, Self>) -> Self::Widget<'w> {
        Text::new(ctx.state().to_string())
    }
}

/// This widget will display a different number every time it gets rebuilt.
#[derive(ViewWidget)]
pub struct ChangesOnRebuild;

impl ViewWidget for ChangesOnRebuild {
    fn build<'w>(&'w self, _: BuildContext<'w, Self>) -> Self::Widget<'w> {
        Text::new(rand::thread_rng().gen::<usize>().to_string())
    }
}

此处附上Flutter的Counter代码,读者可观察其异同,至于Flutter做开发的好处,只有当读者真正去用的时候才会体会到了。文章来源地址https://www.toymoban.com/news/detail-789757.html

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '点击按钮的次数:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), 
    );
  }
}

到了这里,关于【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架

    https://github.com/kwsc98/krpc-rust 刚刚学习Rust语言或者没怎么了解Rust-RPC框架的同学,可能以为又是一个标题党了,但实际上了解过这部分的同学都知道,目前来说主流的Rust-RPC框架和实际定义的RPC框架还是有着很大的差别。我们先看一下隔壁Java是如何实现的,就拿本项目Java版本

    2024年01月23日
    浏览(48)
  • 推荐一个开源的区块链开发者工具网站

    开源区块链开发者工具箱 https://ChainTool.tech 今天可以正式上线了。ChainTool 使用完全开源的方式编写一些开发者日常经常使用的工具。 大约在两个月前, ChainToolDAO 成立了,成立 ChainToolDAO 的来由是这样的:我是一名区块链开发者,经常要遇到一些琐碎的工作, 例如:临时创建

    2024年02月10日
    浏览(45)
  • 如何成为一个正经的 Microsoft 365 开发者

    托 Covid-19 的福,在过去的几年里,在全球领域,Microsoft 365 已经成为组织交流和协作的优选,每月有超过 2.7 亿的活跃用户。通过成为 Microsoft 365 开发者,您可以扩展、集成 LOB(line-of-business) 应用程序,并通过 Microsoft Graph 访问 Microsoft 365 的数据,根据组织的需求定制您的体验

    2024年02月05日
    浏览(42)
  • AI开发者需要了解的机器学习算法、框架及其应用

    作者:禅与计算机程序设计艺术 首先要对自己有一个大致了解,你目前是个什么样的AI人才,我相信大多数AI开发者都有很多类似的经历和积累。从事领域不同、职级高低、个人技术能力等方面而言,他们在这些方面的差距都不小。本文将从以下几个方面阐述自己的背景及过

    2024年02月07日
    浏览(56)
  • 怎么通过微信开发者工具打开一个项目

    最近要修改一个老项目的微信小程序 当接收完老项目后,我直接用HBuilder X运行起来  结果还不错正常运行起来 但是打开页面时显示只能通过手机微信访问 于是我通过微信开发者工具打开  选择项目后(APP-ID)自己申请的测试ID 打开项目后显示启动失败,没有出现页面  这里是我

    2024年02月09日
    浏览(47)
  • 告别过去,拥抱未来:一个Java开发者的成长之路

    时光飞逝,不知不觉已经到了大四毕业的时候。回顾这四年的学生生涯,Java开发是让我最为热爱和投入的一部分。在这里,我想和大家分享我在Java开发方面的收获、经验和感悟,同时也向过去的自己告别,迎接未来的挑战。 在大一的时候,我们学习了Java编程基础,当时我并

    2024年02月08日
    浏览(58)
  • 开发者出海|每周认识一个移动广告渠道之一 · Unity Ads

    广告是游戏厂商盈利的主要手段之一。随着各个公司开始准备2024的年度计划,为了帮助大家能在明年找准渠道,跟上行业与生态变化。光子易PhotonPay推出《应用出海|每周认识一个移动广告渠道》,将更深度的解读一些新兴渠道和垂直领域中的新面孔,帮助大家把握优质渠道

    2024年02月21日
    浏览(37)
  • 《Linux安全实战》每一个从事Linux相关的开发者都应该好好看看

    众所周知,Linux 在安全上拥有独特的设计和特性,如分层的系统架构和强大的访问控制机制。其开源代码经过广泛审查且更新频繁,漏洞得到及时修补。此外,Linux社区的热情参与也极大地增强了系统的安全性。此种安全意识贯穿于整个生命周期,从内核到用户态。这些特性

    2024年02月06日
    浏览(51)
  • 使用 Rust 开发一个微型游戏

    建立项目 实现 Game loop 不同的游戏模式 添加玩家 添加障碍和计分 汇总 为了让游戏流畅、顺滑的运行,需要使用 Game loop Game loop: 初始化窗口、图形和其它资源 每当屏幕刷新(通常是每秒 30、60或更多次),它都会运行 每次通过循环,它都会调用游戏的 tick() 函数 开始 - 配

    2024年02月06日
    浏览(33)
  • 创建一个微信小程序——如何注册账号,安装微信开发者工具,创建一个小程序(详细步骤版)

    注册地址 注册地址:微信公众平台 注册 右上角——【立即注册】。 选择【小程序】。 按照步骤完成注册。 按照步骤激活邮箱后,在信息登记这里选择个人。 填写相关信息。 完成注册。 这一步可以先保留,后续在创建小程序时会用到AppID——点击【前往小程序】,复制A

    2024年02月06日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包