Skip to main content

Functions and Callbacks in Slint

Introduction

Functions in Slint allow you to name, organize, and reuse pieces of logic.
They can be defined inside components or elements within components — but not globally, inside structs/enums, or nested within other functions.

Declaring Functions

Functions are declared with the function keyword:

export component Example {
function my-function(parameter: int) -> string {
return "result";
}
}
  • Parameters: (name: type) format, passed by value.
  • Return type: after ->.
  • If no explicit return, the last statement's value is returned.
  • Use pure for side-effect-free functions.

Calling Functions

Functions can be called:

  • Without an element name (like a normal function call).
  • With an element name (like a method).
import { Button } from "std-widgets.slint";

export component Example {
property <string> my-property: my-function();
property <int> my-other-property: my_button.my-other-function();

pure function my-function() -> string {
return "result";
}

Text {
text: root.my-function();
}

my_button := Button {
pure function my-other-function() -> int {
return 42;
}
}
}

Function Visibility

  • private (default): accessible only within the component.
  • public: accessible from other components via a target (child instance).
  • protected: accessible only by components that inherit from it.

Example:

export component HasFunction {
public pure function double(x: int) -> int {
return x * 2;
}
}

export component CallsFunction {
property <int> test: my-friend.double(1);
my-friend := HasFunction {}
}

Functions in child elements are not accessible externally, even if public.

Public functions in exported components can also be called from backend code (Rust, C++, JS).

Functions vs Callbacks

Similarities:

  • Callable blocks of code.
  • Have parameters and return values.
  • Can be pure.

Differences:

  • Callbacks can be implemented from backend code.
  • Functions must be fully implemented in Slint.
  • Callback syntax differs and supports aliases with <=>.

Declaring Callbacks

Callbacks are declared with the callback keyword.

Example:

export component Example inherits Rectangle {
callback hello;

area := TouchArea {
clicked => {
root.hello()
}
}
}

With Parameters:

callback hello(int, string);
hello(aa, bb) => { /* handler code */ }

With Return Value:

callback hello(int, int) -> int;
hello(aa, bb) => { aa + bb }

With Named Arguments:

callback hello(foo: int, bar: string);
hello(aa, bb) => { /* code */ }

Callback Aliases

You can alias callbacks using <=>:

callback clicked <=> area.clicked;
area := TouchArea {}