如何从Flex容器中删除任何子窗口小部件



我正试图在单击事件时从Flex容器中删除一个子小部件,但找不到任何方法。子窗口小部件也是一个Flex容器。

我尝试过搜索Druid示例和文档,但似乎找不到任何与此用例相关的内容。

我已经设法找到了一种方法,尽管有点古怪,但仍然有效,答案基于eminence@users.rust-lang.org他解释了如何逃脱Rust隐私规则:https://users.rust-lang.org/t/is-private-really-private/7826/15

请注意,这都是在Rust 1.56.1和Druid 0.7.0上完成的。

首先,您声明一个与Flex相同的结构,但有暴露的子级Vector:

use druid::{ WidgetPod };
use druid::widget::{*};
//Same as original but has to be copy/pasted because it is private in its 
own crate
pub struct ChildWidget<T> {
widget: WidgetPod<T, Box<dyn Widget<T>>>,
params: FlexParams,
}
//Struct with exposed children field
pub struct ClearableFlex<T> {
direction: Axis,
cross_alignment: CrossAxisAlignment,
main_alignment: MainAxisAlignment,
fill_major_axis: bool,
pub children: Vec<ChildWidget<T>>, //key part - this is made public
}
impl<T> ClearableFlex<T>
{
//Method that clears vector containing children
pub fn clear(& mut self)
{
self.children.clear();
}
}

然后,在您对容器有可变引用的事件或命令方法中,您使用Rust不安全操作(transmate(:

fn load_products_list(container: &mut Flex<AppState>, data: &mut AppState) {
//Hacky way to clear children, we use container2 if we need to add children again
let container2 : &mut Flex<AppState>;
unsafe {
let clearable_flex : &mut ClearableFlex<AppState> =     std::mem::transmute( container );
clearable_flex.clear();
container2 = std::mem::transmute( clearable_flex );
}
...
}

最新更新