It seems that you can get two additional read-only data stores if View and Update are implemented manually instead of in closure style. In this example I use it to do recursive rendering, but I wonder if there are some other use cases?
pub struct State {}
#[derive(Debug)]
pub enum Message {}
pub struct Updater {
// updater data
}
impl Update<State, Message> for Updater {
fn update(&self, state: &mut State, message: Message) -> Task<Message> {
// access updater data
}
}
pub struct Viewer {
// viewer data
pub remain: i32,
}
impl<'a> View<'a, State, Message, Theme, Renderer> for Viewer {
fn view(&self, state: &'a State) -> Element<'a, Message, Theme, Renderer> {
// access viewer data, rendering itself
Container::new(
Column::new()
.push(Text::new(format!("remain: {}", self.remain)))
.push(
if self.remain > 0 {
Element::from(Viewer { remain: self.remain - 1 }.view(state))
}
else {
Element::from(Text::new("No More"))
}
)
)
.padding(8_f32)
.style(|_theme| {
iced::widget::container::Style {
border: Border { color: Color::WHITE, width: 1_f32, radius: Radius::new(4_f32) },
..Default::default()
}
})
.into()
}
}
