Zustand, Datensätze und Bindungen

Zustand

Alle propertys eines Dialogs, Screens oder einer Komponente sind veränderbarer Zustand, auch mit Standardwert. Die App setzt sie beim Aufbau und danach über generierte Setter:

qml
component PriceTab : Item {
    property bool selected
    Text labelText {
        color: selected ? theme.interactiveColor : theme.textColor
    }
    Rect bar { visible: selected; size: labelText.width + 30, 6 }
}
cpp
tab->setSelected(i == index);

Was einer Änderung folgt:

Gleicher Wert: Ein Setter mit dem Wert, den der Zustand schon hat, tut nichts (Datensätze und Listen werden mit == verglichen). Die App darf also z. B. die Systeminformationen jede Sekunde setzen; neu gebaut wird nur, was sich geändert hat.

Was nicht folgt: einmalige Properties (name, source, onTap, pressSink, spin) und Konstanten (const). Eine neu ausgewertete Gruppe setzt auch ihre Geometrie neu; was die App selbst bewegt (z. B. den Scroll-Griff), bekommt deshalb keine Lage in der .aura-Datei.

Zustände (state) und when

Ein Zustand mit festen Werten (wie QML states), dazu Blöcke, die Properties ändern, solange eine Bedingung gilt:

qml
component SaveButton : Rect {
    state mode: idle, busy, done           // der erste Wert ist der Start
    color: theme.mainColor

    Text label { text: tr("ui_save", "Speichern") }
    Svg spinner { source: "icon_spinner.svg"; visible: false; spin: 1000 }

    when mode == busy {
        opacity: 0.5                        // das Element mit dem when
        // ein Element darin, über seine ID
        label.text: tr("ui_saving", "Speichert …")
        spinner.visible: true
    }
    when root.pressed { color: theme.mainColorDark }
}

Animationen (animate, enter)

Eigenschaften, die sich ändern, gleiten zum neuen Wert, statt zu springen; Elemente, die erscheinen, können sich einblenden:

qml
Rect panel {
    opacity: 1
    // Eigenschaft, ms, Easing (ohne: outQuad)
    animate: opacity 200, color 150 linear
    when mode == busy { opacity: 0.5; color: theme.lightGrey }
}
if view == thanks {
    Rect thanks {
        enter: opacity 0 300        // beim Erscheinen von 0 zum Wert
        exit: opacity 0 300         // beim Abbau zu 0, dann weg
    }
}

Previews

Eine Preview zeigt einen Dialog, Screen oder eine Komponente mit vorbelegten Werten in der Vorschau (VS Code, aura-view), ähnlich #Preview in SwiftUI:

qml
preview "Busy" for SaveButton {
    mode: busy
}
preview "Zwei Produkte" for ShoppingCart {
    lines: [
        { description: "test-Notebook", quantity: 12,
          unitPrice: "0,29 €", linePrice: "3,48 €" },
        { description: "test-Pencil", quantity: 1,
          unitPrice: "9,99 €", linePrice: "9,99 €" }
    ]
}

Datensätze

Daten der App, die aus mehreren Werten bestehen, beschreibt ein record. Eine Liste davon ersetzt die Schleife, in der die App früher je Eintrag eine Komponente gebaut hat:

qml
// cart_screen.aura
record CartLine {
    string description
    string discount
    int quantity
    string unitPrice
    string linePrice
}

Screen ShoppingCart {
    property CartLine[] lines
    signal edit(int index)
    signal remove(int index)

    Column productRows {
        repeat line, i in lines {
            CartRow row {
                index: i
                line: line
                onEdit: edit(i)
                onRemove: remove(i)
            }
        }
    }
}

component CartRow : Rect {
    property int index
    property CartLine line
    signal edit
    signal remove
    Text { text: line.description }
    if line.discount != "" { Text { text: line.discount } }
}
cpp
std::vector<views::CartLine> lines{
    {"Notebook", "", 2, "3.00", "6.00"}
};
auto ui = views::ShoppingCart::build(frame, ctx, {lines});
ui->edit = [](double index) { /* handle the selected row */ };

Neuaufbau von repeat und if

Nennt die Liste eines repeat oder die Bedingung eines if Zustand, baut eine Änderung den Block neu:

cpp
ui->setLines(lines); // update the record list

Lebensdauer

Die Abhängigkeiten (aura::Bindings) hängen am Wurzel-Node, das Struct verweist nur schwach darauf. Ein Setter nach dem Schließen tut nichts.

Dokumentationsquelle: docs/aura.md · Markdown herunterladen

Suche nach Themen, Widgets oder APIs.