use iced::pure::{button, text}; use iced::pure::{Element, Sandbox}; use iced::Settings; use custom_text::custom_text; pub fn main() -> iced::Result { Mode::run(Settings::default()) } enum Mode { Standard, Custom, } #[derive(Debug, Clone, Copy)] enum Message { SwitchToComponent, } impl Sandbox for Mode { type Message = Message; fn new() -> Self { Self::Standard } fn title(&self) -> String { String::from("Stateless Component Bug") } fn update(&mut self, message: Message) { match message { Message::SwitchToComponent => *self = Mode::Custom, } } fn view(&self) -> Element { match self { Self::Standard => button(text("Click to Panic")) .on_press(Message::SwitchToComponent) .into(), Self::Custom => button(custom_text("..")).into(), } } } mod custom_text { use iced::pure::text; use iced_lazy::pure::{self, Component}; use iced_native::text; use iced_pure::Element; pub struct CustomText<'a> { text: &'a str, } pub fn custom_text<'a>(text: &'a str) -> CustomText<'a> { CustomText { text } } #[derive(Debug, Clone)] pub enum Event {} impl<'a> CustomText<'a> { pub fn new(text: &'a str) -> Self { Self { text } } } impl<'a, Message, Renderer> Component for CustomText<'a> where Renderer: text::Renderer + 'static, { type State = (); type Event = Event; fn update( &mut self, _state: &mut Self::State, _event: Event, ) -> Option { None } fn view(&self, _state: &Self::State) -> Element { text(self.text).into() } } impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where Message: 'a, Renderer: 'static + text::Renderer, { fn from(x: CustomText<'a>) -> Self { pure::component(x) } } }