2017-09-04 2 views
2

Ich versuche, die Struktur einer Rust- und GTK-RS-Anwendung zu erhöhen, aber ich kann nicht herausfinden, wie ich mit Ereignisverbindungen umgehen soll. Ich sehe, dass das Problem in der falschen Lebenszeit liegt, aber ich verstehe nicht wirklich, wie es behoben werden könnte.Typ muss die statische Lebensdauer erfüllen

#[derive(Debug)] 
struct CreatingProfileUI { 
    window: gtk::MessageDialog, 
    profile_name_entry: gtk::Entry, 
    add_btn: gtk::Button, 
    cancel_btn: gtk::Button, 
} 

#[derive(Debug)] 
struct UI { 
    window: gtk::Window, 

    // Header 
    url_entry: gtk::Entry, 
    open_btn: gtk::Button, 

    // Body 
    add_profile_btn: gtk::Button, 
    remove_profile_btn: gtk::Button, 
    profiles_textview: gtk::TextView, 

    // Creating profile 
    creating_profile: CreatingProfileUI, 

    // Statusbar 
    statusbar: gtk::Statusbar, 
} 

impl UI { 
    fn init(&self) { 
     self.add_profile_btn 
      .connect_clicked(move |_| { &self.creating_profile.window.run(); }); 
    } 
} 

Und ich bekomme diese Fehlermeldung:

error[E0477]: the type `[[email protected]/main.rs:109:46: 111:6 self:&UI]` does not fulfill the required lifetime 
    --> src/main.rs:109:30 
    | 
109 |   self.add_profile_btn.connect_clicked(move |_| { 
    |        ^^^^^^^^^^^^^^^ 
    | 
    = note: type must satisfy the static lifetime 
+1

['ButtonExt :: connect_clicked'] (https://docs.rs/gtk/0.2.0/gtk/trait.ButtonExt.html#typmethod.connect_clicked) benötigt eine Funktion mit der '' statischen '' Lebensdauer. Related (um Threads, aber der Fehler ist der gleiche): https://Stackoverflow.com/a/28661524/1233251 –

Antwort

4

Sie können keine nicht-statische Referenzen in GTK Rückrufe bewegen. Sie benötigen etwas statisches oder etwas zugewiesenes Heap (z. B. in einer Box/RefCell/Rc/etc.).

Callbacks werden nicht aus dem Bereich aufgerufen, in dem Sie sich mit dem Signal verbinden, sondern zu einem späteren Zeitpunkt von der Hauptschleife aus. Es ist erforderlich, dass, was auch immer Sie in die Schließung übergeben, noch am Leben ist, was alles 'static, Heap-Alloced oder auf dem Stack zwischen Main und wo die Hauptschleife ausgeführt wird. Der letzte Teil kann momentan nicht gut mit Rust/GTK-rs ausgedrückt werden.

Siehe the example at the bottom in the gtk-rs docs for an example. Es verwendet eine Rc<RefCell<_>>.

+0

Ein Beispiel für die Implementierung https://github.com/hfiguiiere/gpsami/blob/f4e612dcaa35648d033846027e74903cdf62b7a4/src/mgapplication .rs # L96 – Infernion

Verwandte Themen