Loading the lesson...
In the print dialog, choose "Save as PDF" as the destination.
Operating Systems 2 - Lab 6
Making the UI react to data, planning multi-screen apps, and displaying dynamic lists
UI depends on.UI should reflect the new valuesCalculateRule 1
reads from a variable
Rule 2
the variable's value changes
Rule 3
setState is called
Widget rebuilds
setState(() {
userAge = calculateAge(birthDate, today);
});StatelessWidget vs StatefulWidgetStatelessWidget | StatefulWidget | |
|---|---|---|
| Can it rebuild itself? | No | Yes |
Has setState()? | No | Yes |
| Use when | UI never changes after first build | UI changes from user input or new data |
setState in Actionclass _AgeResultWidgetState extends State<AgeResultWidget> {
UserAge? userAge;
@override
Widget build(BuildContext context) {
return Text('Years: ${userAge?.years ?? 0}');
}
}Why does one setState() call update years, months, and days?setState callintlDateTime.toString() output is not user-friendlyintl package, then format with DateFormatString formatted = DateFormat('d/M/yyyy').format(myDate);
// "5/3/2025"DateFormat turns a raw DateTime into a readable string.Browse courses
Open a course
See modules
See lessons
View lesson pages
UI Layer
widgets, displays data
Business Logic
filters, validates, transforms
Data / Repository
calls API or database
ListView BasicsColumn | ListView | |
|---|---|---|
| Scrolling | No built-in scroll | Scrolls automatically |
mainAxisAlignment | Yes | Not available |
| Large or dynamic item count | Overflow error | Handles any size |
children list, best for a small, known number of itemsListView(
children: [
Container(height: 60, child: Text('Item 1')),
Container(height: 60, child: Text('Item 2')),
],
)ListView.builder| Parameter | Description |
|---|---|
itemCount | Total number of items |
itemBuilder | Called once per visible item; receives context and index |
ListView.builder(
itemCount: courses.length,
itemBuilder: (context, index) => CourseCard(course: courses[index]),
)ListView.separated and Horizontal ScrollListView.separated adds a separatorBuilder between items, for example a DividerscrollDirection: Axis.horizontal for a horizontally scrolling listListView.separated(
itemCount: courses.length,
itemBuilder: (context, index) => CourseCard(course: courses[index]),
separatorBuilder: (context, index) => const Divider(),
)ListView(
scrollDirection: Axis.horizontal,
children: [...],
)Parent setState called
Header rebuilds
List rebuilds
Footer rebuilds
Only Header's setState called
CoursesHeader rebuilds
setState is calledStatelessWidget never rebuilds itself; StatefulWidget does, via setStateintl package formats dates cleanly, wrap it in a small utility classListView.builder lazily renders only visible items, the standard choice for dynamic or large listsMahmoud Abas|Lab 06: State Management, ListViews, and UI Architecture