从React的视角谈谈Rust和GTK腾讯云开发者社区

虽说以前我也短暂尝试过GTK,但它对我来说还是很陌生的。在此之前,我在用户界面上的大部分经验都来自于React应用程序的构建。从React到GTK的过渡带来了一些挑战,其中多数是小部件原理上的差异造成的。用Rust写GTK是尤其困难的事情,因为Rust强制执行一些额外的规则来防止内存管理错误,并避免在线程上下文中执行不安全的操作。

在本文中,我将主要讨论如何将React的理念应用到GTK中,并重点介绍一些使GTK符合Rust规则所必需的技巧。Rust制订了一些不好对付的强制规则,这些规则对于大多数开发人员来说都是陌生的;规则主要涉及值的共享方式,但在可变性方面也有严格的限制。我将在本文中遇到这些场景时指出它们。

一些术语的注释:

所有组件中最简单的,就像React组件一样是一小组小部件,这些小部件创建后就永远不会更新。这可以简单地实现为返回一个GTK小部件的函数。

pubfndate_c(date:&chrono::Date)->gtk::Label{gtk::Label::new(Some(&format!("{}",date.format("%B%e,%Y"))))}当组件实际上是一个很少或甚至从不更新的可视组件时,这种模式就是可行的。在我的应用程序中,日期标签是更大一块显示内容的子组件,因此是永远不变的东西。

具有内部小部件状态的组件肯定要复杂得多,但仍然可以实现为一个返回GTK小部件的函数。调用方可以直接从返回的GTK小部件中读取数据;在调用方提供一个回调,并且组件代码写明了何时调用回调时,这种模式可以说是最有效的。

2020-01-31:事实证明,我在本节的代码中犯了一些大错。我需要对其进行相当大的修改,以更有效地处理组件更新,并在一个GTK回调中更改组件状态。

当我使用上面提到的这种简单组件构建应用程序时,我将它们组合到一些更复杂的组件中,这些组件具有多份逻辑上互相归属,但机制上可以在各个子组件中编辑的数据。为此,我在设置内部状态时会独立于子组件的状态。

所幸我一般来说还是可以将其实现为一个函数。

回顾一下,在上面的函数中,我们有一段代码来克隆包含记录的Arc。该克隆将移至’duration_edit_c’的回调函数中(这意味着该回调函数现在拥有这个克隆)。在这个回调函数中将可变地借用记录、更新记录、克隆数据并将其传递给’on_update’,然后将在该块末尾自动删除写锁定。

最后,第四个模式涵盖了需要响应系统更改的所有组件。用React术语来说,这意味着属性可能从Redux更改。

在较高的层级上,我们需要一个’struct’来跟踪在给定新数据时可能会更新的所有可视组件,以及一个将处理这些更新并返回根级小部件的’render’函数。

在这里我用自己的History组件举例。

structHistoryComponent{widget:gtk::Box,history_box:gtk::Box,}pubstructHistory{component:Option,ctx:Arc>,}implHistory{pubfnnew(ctx:Arc>)->History{...}pubfnrender(&mutself,range:DateRange,records:Vec>,)->>k::Box{...}实际上,这里的构造函数非常简单,除了创建抽象的’History’组件外什么都不做。由于它没有数据可填充到小部件中,因此它这里甚至还没有创建小部件。这样非常方便,因为在构造时组件可能会需求尚不可用的数据。大部分工作是在’render’中完成的:

pubfnrender(&mutself,range:DateRange,records:Vec>,)->>k::Box{matchself.component{None=>{...}Some(HistoryComponent{refwidget,refhistory_box,...})=>{history_box.foreach(|child|child.destroy());records.iter().for_each(|record|{letctx=self.ctx.clone();letday=Day::new(record.clone(),ctx,);day.show();history_box.pack_start(&day.widget,true,true,25);});&widget}}}在随后的调用中,render将处理小部件的更新。如何填充新数据的细节因组件而异。在本例中我将销毁所有现有子组件,并根据我拥有的数据创建新的子组件。这是一个非常幼稚的策略,但有时它挺好用的。

就这些了。经过数周的学习,在理解如何编写GTK的过程中我发现了四种高级模式。我觉得这些模式已经很完备了。

在撰写本文的整个过程中,我也对我的组件做了大量修改、重构和简化。我想这四种模式将帮助我进一步改进我的应用程序,同时我也希望在继续学习的过程中能学到更多内容。

THE END
1.电脑的主要组件电脑的主要组件 中央处理器(CPU):电脑的大脑,负责解释和执行程序指令,进行数学和逻辑运算。 主板(Motherboard):连接所有电脑组件的平台,包括CPU插座、内存插槽、PCIe插槽等。 内存(RAM):随机存取存储器,用于暂时存储正在运行的程序和数据,速度非常快,但断电后数据会丢失。https://blog.csdn.net/weixin_73699318/article/details/144806169
2.零部件的定义组装未来解析关键词汇零部件是制造业中的基本单元,它们通过组装和整合形成最终产品。理解零部件的定义,对于提高生产效率、降低成本以及优化物流管理至关重要。 定义与分类 零部件可以根据其功能和用途进行分类,如机械零部件、电子元器件等。了解这些分类有助于快速识别并定位所需零部件,从而缩短供货周期。 https://www.hlwdd.com/ke-yan-dong-tai/437697.html
3.汽车的三大件是什么?哪个最重要?以下是汽车构成的核心组件,它们被誉为汽车的基石: 发动机、变速器和底盘。这三大组成部分不可或缺,共同承载着车辆的动力、转换和支撑功能。发动机作为心脏,提供车辆行动的能量源泉,而变速器则负责传递和调节动力,底盘则确保车辆的稳定性和行驶性能。它们的质量直接影响着汽车的性能寿命,任何一项出现问题都可能对车辆的正https://www.autohome.com.cn/baike/796886.html
4.14.图解鸿蒙之布局组件大小mb647aa95bca47a的技术博客在鸿蒙的相对布局体系里,有个很关键的点要留意,那就是子组件的尺寸大小,它基本不受相对布局规则的干扰。要是在子组件的某个方向上,你给它安排了两个或者更多的alignRules,这时候最好别再去设置这个方向的尺寸大小啦。为啥呢?因为这么做很容易让对齐规则算出来的组件尺寸,和咱们开发者手动设置的尺寸 “掐架”,产https://blog.51cto.com/u_16149405/13004393
5.汽车配件属于什么类目汽车配件属于什么类目 汽车配件属于汽车行业的子行业,更具体地说是汽车后市场的一部分。它涉及到各种汽车零部件、组件、附件和工具等,用于汽车的维修、保养、升级和改装等。汽车配件可以进一步分类为发动机配件、底盘配件、电器配件、车身配件等。https://news.yiche.com/baike/4986620.html
6.FCE中的哪个组件向绝大多数的飞控部件提供28VDC?声明: 本网站大部分资源来源于用户创建编辑,上传,机构合作,自有兼职答题团队,如有侵犯了你的权益,请发送邮箱到feedback@deepthink.net.cn 本网站将在三个工作日内移除相关内容,刷刷题对内容所造成的任何后果不承担法律上的任何义务或责任 https://www.shuashuati.com/ti/29f3710cf33544e986cdb85124b5ad1ca1.html
7.大型部件装配管理生产制造与装配FARO在装配车间轻松、正确地测量大型部件。 在装配过程中,使用精密测量工具对大型部件进行精确校准。FARO 三维测量和投影解决方案使之成为可能。 查看大型装配解决方案 精确快速的大规模装配技术 在飞机、船只、军事设备、能源行业和其他应用场景下装配大型部件是一件颇具挑战性的工程。在装配过程早期识别部件错误和校准问题对https://www.faro.com/zh-CN/Application/Production-Fabrication-and-Assembly/Large-scale-Parts-Assembly-Management
8.周产2000余个部件:FormAuto如何实现批量生产Formlabs在3D 打印这样一个快节奏且竞争激烈的行业中,有时眼见为实。为了提供切实的证据,Formlabs 制造和服务中心 (MSB) 已经使用 3D 打印为我们的打印机制作了数十万个样品部件,甚至包括成品组件。通过完成如此数量的打印,生态圈的生产能力已经得到了证明。现在,我们通过全新 Formlabs 自动化生态圈进一步提高了产量。 https://formlabs3d.cn/blog/how-form-auto-enables-production/
9.重磅!速看:美恢复352项中国进口商品关税豁免,附中英文清单全文笔者注意到,本次关税豁免清单中有不少涉及电子领域的产品。据悉,此前几轮的关税上涨,已对美国电子行业企业造成实质性的影响。根据美国行业协会消费者技术协会(CTA)的数据,2018年7月以来,美国加征关税已让美国消费电子行业损失超过100亿美元,尤其是芯片等电子零部件行业厂商受到的影响最大。 https://maimai.cn/article/detail?fid=1720668418&efid=HS5yVAhS-kmIzmt_-hHT4Q