#rust #druid-rs
Вопрос:
Я использую набор пользовательского интерфейса druid, и это работает
fn build_list_item() -gt; impl Widgetlt;TodoItemgt; { Flex::row() .with_child(Checkbox::new("").lens(TodoItem::completed)) .with_flex_child( Label::new(|item: amp;TodoItem, _: amp;_| item.description.clone()), 1.0, ) } // and then List::new(|| build_list_item())
Но я хочу добиться этого
List::new(build_list_item())
Поэтому я изменил функцию следующим образом
fn build_list_item() -gt; impl Fn() -gt; impl Widgetlt;TodoItemgt; { || { Flex::row() .with_child(Checkbox::new("").lens(TodoItem::completed)) .with_flex_child( Label::new(|item: amp;TodoItem, _: amp;_| item.description.clone()), 1.0, ) } }
и получил ошибку компилятора, такую как
error[E0562]: `impl Trait` not allowed outside of function and method return types --gt; src/main.rs:33:39 | 33 | fn build_list_item2() -gt; impl Fn() -gt; impl Widgetlt;TodoItemgt; { | ^^^^^^^^^^^^^^^^^^^^^
Как это исправить?
Комментарии:
1. Вы пробовали просто использовать
List::new(build_list_item)
свой исходный код?2. @Ivan C, Отличный ответ,
List::new(build_list_item)
работает!
Ответ №1:
Поскольку размер возвращаемого Widget
файла неизвестен во время компиляции, вы можете использовать следующее решение:
fn build_list_item() -gt; impl Fn() -gt; Flexlt;TodoItemgt; { amp;|| {Flex::row() .with_child(Checkbox::new("").lens(TodoItem::completed)) .with_flex_child( Label::new(|item: amp;TodoItem, _: amp;_| item.description.clone()), 1.0, )} } // and then List::new(build_list_item());