Flint UI lets you build browser interfaces with Dart components.
The goal is not to hide the web. The goal is to keep the same Dart mental model across your backend and frontend: components are Dart classes, state is Dart fields, events are Dart callbacks, and styles can live beside the UI with DartStyle.
A component is a Dart class
Create a component by extending Component and returning a view from build().
CodeBlockdart
import 'package:flint_ui/flint_ui.dart';
class WelcomeCard extends Component {
@override
View build() {
return Container(
dartStyle: const DartStyle(
display: Display.grid,
gap: 12,
padding: EdgeInsets.all(20),
radius: 14,
background: Color.rgba(15, 23, 42, 0.72),
),
children: [
Text.h2('Build UI in Dart'),
Text.p('Components, state, events, and styling stay in one language.'),
],
);
}
}
The public API uses Component and View. The internal node system stays inside Flint UI.
Props come from the server
Server-rendered Flint pages can pass props into a component.
HtmlContent updates when parent state changes, so loading new Markdown into the same page does not require manual document.getElementById(...) code in your app.
Preserve state and receive updates
Flint preserves component instances so local state is not lost during a rerender. If a stateful component also accepts constructor values, override updateFrom to copy the new values into the preserved instance.
This keeps state powerful without making constructor data stale.
The Flint UI idea
Flint UI is for developers who want to keep the frontend in Dart while still building real browser interfaces.
Start with a component. Pass JSON-safe props. Add state when the UI needs it. Keep styles visible with DartStyle. Then grow the page into a real app without leaving the Dart ecosystem.
F
Flint DartBackend framework and Dart UI docs
Build routes, controllers, APIs, docs, and browser UI from one Dart-shaped stack.