Screens / lists
Agenda
Shows a week one day at a time: seven days with the busy ones marked, then the chosen day’s events in cards, all-day ones first and the current one marked.
Import
Agenda is part of Fliin Pro. With a license key, sign in once with fliin login, then add it in a Flutter app where fliin init has run:
fliin login
fliin add agendaAlso installs: alert, app-bar, badge, button, core, empty-state, list-row, page, skeleton, avatar, event-card, icons
Examples
Day
The day chosen in the week strip, its events in cards; the dots under the days mark those that have events. standalone holds its own controller over the service you pass; onOpen receives the event touched.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaDayExample extends StatelessWidget {
const AgendaDayExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: AgendaShown(sampleAgenda(_today)),
day: _today,
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onBack: () {},
);
}
}Overnight
A day whose event ends the next morning: the end time carries its day. standalone holds its own controller over the service you pass; onOpen receives the event touched.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaOvernightExample extends StatelessWidget {
const AgendaOvernightExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: AgendaShown(sampleAgenda(_today)),
day: DateTime(2026, 10, 28),
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onBack: () {},
);
}
}Empty
A day without events: the screen says so under the week strip. standalone holds its own controller over the service you pass; onOpen receives the event touched.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaEmptyExample extends StatelessWidget {
const AgendaEmptyExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: const AgendaShown([]),
day: _today,
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onBack: () {},
);
}
}Loading
While the service answers, placeholders keep the shape of the cards. standalone holds its own controller over the service you pass; onOpen receives the event touched.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaLoadingExample extends StatelessWidget {
const AgendaLoadingExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: const AgendaLoading(),
day: _today,
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onBack: () {},
);
}
}Error
When loading fails, the screen says so and offers to try again. standalone holds its own controller over the service you pass; onOpen receives the event touched.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaErrorExample extends StatelessWidget {
const AgendaErrorExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: const AgendaFailed(),
day: _today,
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onBack: () {},
);
}
}Offline
Without a connection, the screen asks to reconnect rather than showing an error. standalone holds its own controller over the service you pass; onOpen receives the event touched.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaOfflineExample extends StatelessWidget {
const AgendaOfflineExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: const AgendaOffline(),
day: _today,
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onBack: () {},
);
}
}Add
Creating events: onAdd puts a "+" in the bar and "New event" on an empty day; both give you the chosen day, your form does the rest.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaAddExample extends StatelessWidget {
const AgendaAddExample({super.key});
static final _today = DateTime(2026, 10, 27);
@override
Widget build(BuildContext context) {
return AgendaScreen.standalone(
service: SampleAgendaService(today: _today, latency: const Duration(milliseconds: 600)),
initial: const AgendaShown([]),
day: _today,
now: () => DateTime(2026, 10, 27, 13),
onOpen: (_) {},
onAdd: (_) {},
onBack: () {},
);
}
}Routing
fliin add agenda prints the route for the router it finds in your pubspec, a file next to the page that wires its navigation. Each of them:
go_router
// lib/agenda_route.dart, next to agenda_page.dart.
import 'package:go_router/go_router.dart';
import 'agenda_page.dart';
/// Add agendaRoute to the routes of your GoRouter.
final agendaRoute = GoRoute(
path: '/agenda',
builder: (context, state) => AgendaPage(
// The path of the page of an event in your app.
onOpen: (event) => context.push('/events/${Uri.encodeComponent(event.id)}'),
// Alone in the stack (deep link, go): your app's home.
onBack: () => context.canPop() ? context.pop() : context.go('/'),
),
);navigator
// lib/agenda_route.dart, next to agenda_page.dart.
import 'package:flutter/material.dart';
import 'agenda_page.dart';
/// Opens “Agenda”: `Navigator.of(context).push(agendaRoute(eventPage: …))`.
/// [eventPage] builds the page of an event in your app.
Route<void> agendaRoute({
required Widget Function(String eventId) eventPage,
}) => MaterialPageRoute<void>(
builder: (context) => AgendaPage(
onOpen: (event) => Navigator.of(context).push(MaterialPageRoute<void>(builder: (_) => eventPage(event.id))),
onBack: () => Navigator.of(context).maybePop(),
),
);State
The controller is a ChangeNotifier from widgets.dart, with no package. fliin add agenda prints the page that holds it with the state management it finds, its imports written for your package; below they read your_app. Your backend implements the Service interface of the screen's _data.dart file:
none
// lib/agenda_page.dart
// Your backend: implement AgendaService (agenda_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
class AgendaPage extends StatelessWidget {
const AgendaPage({
super.key,
required this.onOpen,
required this.onBack,
});
final ValueChanged<AgendaEvent> onOpen;
final VoidCallback onBack;
@override
Widget build(BuildContext context) => AgendaScreen.standalone(
service: SampleAgendaService(today: DateTime.now()),
onOpen: onOpen,
onBack: onBack,
);
}provider
// lib/agenda_page.dart
// Your backend: implement AgendaService (agenda_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
class AgendaPage extends StatelessWidget {
const AgendaPage({
super.key,
required this.onOpen,
required this.onBack,
});
final ValueChanged<AgendaEvent> onOpen;
final VoidCallback onBack;
@override
Widget build(BuildContext context) => ChangeNotifierProvider(
create: (_) => AgendaController(service: SampleAgendaService(today: DateTime.now()), day: DateTime.now(), firstWeekday: DateTime.monday)..load(),
child: Builder(
builder: (context) => AgendaScreen(
controller: context.read<AgendaController>(),
onOpen: onOpen,
onBack: onBack,
),
),
);
}riverpod
// lib/agenda_page.dart
// Your backend: implement AgendaService (agenda_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final agendaControllerProvider = Provider.autoDispose<AgendaController>((ref) {
final controller = AgendaController(service: SampleAgendaService(today: DateTime.now()), day: DateTime.now(), firstWeekday: DateTime.monday)..load();
ref.onDispose(controller.dispose);
return controller;
});
class AgendaPage extends ConsumerWidget {
const AgendaPage({
super.key,
required this.onOpen,
required this.onBack,
});
final ValueChanged<AgendaEvent> onOpen;
final VoidCallback onBack;
@override
Widget build(BuildContext context, WidgetRef ref) => AgendaScreen(
controller: ref.watch(agendaControllerProvider),
onOpen: onOpen,
onBack: onBack,
);
}bloc
// lib/agenda_page.dart
// Your backend: implement AgendaService (agenda_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/agenda/agenda_controller.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_data.dart';
import 'package:your_app/ui/fliin/screens/agenda/agenda_screen.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
/// The screen's controller as a bloc, for your BlocListener and BlocBuilder:
/// one emission per controller notification. `version` tells them apart
/// when `state` does not change (mode, filters, text…, read them on
/// `controller`). The screen listens to the controller itself.
class AgendaCubit extends Cubit<({AgendaState state, int version})> {
AgendaCubit(this.controller) : super((state: controller.state, version: 0)) {
controller.addListener(_changed);
}
final AgendaController controller;
void _changed() => emit((state: controller.state, version: state.version + 1));
@override
Future<void> close() {
controller
..removeListener(_changed)
..dispose();
return super.close();
}
}
class AgendaPage extends StatelessWidget {
const AgendaPage({
super.key,
required this.onOpen,
required this.onBack,
});
final ValueChanged<AgendaEvent> onOpen;
final VoidCallback onBack;
@override
Widget build(BuildContext context) => BlocProvider(
create: (_) => AgendaCubit(AgendaController(service: SampleAgendaService(today: DateTime.now()), day: DateTime.now(), firstWeekday: DateTime.monday)..load()),
child: Builder(
builder: (context) => AgendaScreen(
controller: context.read<AgendaCubit>().controller,
onOpen: onOpen,
onBack: onBack,
),
),
);
}API
AgendaScreen: class extends StatefulWidget
AgendaScreen.new: const new({super.key, required AgendaController controller, required ValueChanged<AgendaEvent> onOpen, VoidCallback? onBack, DateTime Function() now, AgendaDateFormat? formatDate, AgendaTimeFormat? formatTime, ValueChanged<DateTime>? onAdd})
AgendaScreen.standalone: const new({super.key, required AgendaService service, required ValueChanged<AgendaEvent> onOpen, AgendaState? initial, DateTime? day, VoidCallback? onBack, DateTime Function() now, AgendaDateFormat? formatDate, AgendaTimeFormat? formatTime, ValueChanged<DateTime>? onAdd})
AgendaScreen.controller: get AgendaController?
AgendaScreen.service: get AgendaService?
AgendaScreen.initial: get AgendaState?
AgendaScreen.day: get DateTime?
AgendaScreen.onOpen: get ValueChanged<AgendaEvent>
AgendaScreen.onBack: get VoidCallback?
AgendaScreen.now: get DateTime Function()
AgendaScreen.formatDate: get AgendaDateFormat?
AgendaScreen.formatTime: get AgendaTimeFormat?
AgendaScreen.onAdd: get ValueChanged<DateTime>?
AgendaScreen.createState: State<AgendaScreen>()
AgendaState: sealed class permits {AgendaFailed, AgendaLoading, AgendaOffline, AgendaShown}
AgendaState.new: const new()
AgendaLoading: final class extends AgendaState
AgendaLoading.new: const new()
AgendaFailed: final class extends AgendaState
AgendaFailed.new: const new()
AgendaOffline: final class extends AgendaState
AgendaOffline.new: const new()
AgendaNotice: enum {refreshFailed, refreshOffline}
AgendaNotice.refreshFailed: static final AgendaNotice
AgendaNotice.refreshOffline: static final AgendaNotice
AgendaShown: final class extends AgendaState
AgendaShown.new: const new(List<AgendaEvent> events, {bool refreshing, AgendaNotice? notice})
AgendaShown.events: get List<AgendaEvent>
AgendaShown.refreshing: get bool
AgendaShown.notice: get AgendaNotice?
AgendaController: class extends ChangeNotifier
AgendaController.new: new({required AgendaService service, required DateTime day, int firstWeekday, AgendaState initial})
AgendaController.service: get AgendaService
AgendaController.firstWeekday: get int
AgendaController.state: get AgendaState
AgendaController.day: get DateTime
AgendaController.week: get List<DateTime>
AgendaController.load: Future<void>()
AgendaController.refresh: Future<void>()
AgendaController.select: void(DateTime day)
AgendaController.step: void({required bool forward})
AgendaController.dispose: void()
AgendaTiming: sealed class permits {AgendaAllDay, AgendaTimed}
AgendaTiming.new: const new()
AgendaTimed: final class extends AgendaTiming
AgendaTimed.new: new(DateTime start, DateTime end)
AgendaTimed.start: get DateTime
AgendaTimed.end: get DateTime
AgendaAllDay: final class extends AgendaTiming
AgendaAllDay.new: new(DateTime first, [DateTime? last])
AgendaAllDay.first: get DateTime
AgendaAllDay.last: get DateTime
AgendaEvent: final class
AgendaEvent.new: const new({required String id, required String title, required AgendaTiming timing, String? location, String? description, List<String> attendees})
AgendaEvent.id: get String
AgendaEvent.title: get String
AgendaEvent.timing: get AgendaTiming
AgendaEvent.location: get String?
AgendaEvent.description: get String?
AgendaEvent.attendees: get List<String>
AgendaOccurrence: final class
AgendaOccurrence.event: get AgendaEvent
AgendaOccurrence.day: get DateTime
AgendaOccurrence.start: get DateTime?
AgendaOccurrence.end: get DateTime?
AgendaOccurrence.wholeDay: get bool
AgendaOccurrence.startsBefore: get bool
AgendaOccurrence.endsAfter: get bool
AgendaOccurrence.isCurrentAt: bool(DateTime now)
agendaDayOf: DateTime(DateTime moment)
agendaOccurrences: List<AgendaOccurrence>(Iterable<AgendaEvent> events, DateTime day)
agendaWeekStart: DateTime(DateTime day, int firstWeekday)
agendaWeek: List<DateTime>(DateTime day, int firstWeekday)
AgendaNoNetwork: final class implements Exception
AgendaNoNetwork.new: const new()
AgendaService: abstract interface class
AgendaService.new: new()
AgendaService.events: abstract Future<List<AgendaEvent>>(DateTime from, DateTime to)
sampleAgenda: List<AgendaEvent>(DateTime today)
SampleAgendaService: final class implements AgendaService
SampleAgendaService.new: new({required DateTime today, List<AgendaEvent>? events, Duration latency})
SampleAgendaService.latency: get Duration
SampleAgendaService.requests: get List<(DateTime, DateTime)>
SampleAgendaService.events: Future<List<AgendaEvent>>(DateTime from, DateTime to)
AgendaDateFormat: typedef = String Function(DateTime day, Locale locale)
AgendaTimeFormat: typedef = String Function(DateTime moment, Locale locale)
agendaL10n: const Map<String, Map<String, String>>
AgendaStrings: final class
AgendaStrings.new: const new(String language, {required DateTime now, AgendaDateFormat? formatDate, AgendaTimeFormat? formatTime})
AgendaStrings.of: factory new(BuildContext context, {required DateTime now, AgendaDateFormat? formatDate, AgendaTimeFormat? formatTime})
AgendaStrings.language: get String
AgendaStrings.now: get DateTime
AgendaStrings.formatDate: get AgendaDateFormat?
AgendaStrings.formatTime: get AgendaTimeFormat?
AgendaStrings.digits: String(int n)
AgendaStrings.firstWeekday: get int
AgendaStrings.initial: String(DateTime day)
AgendaStrings.date: String(DateTime day)
AgendaStrings.weekRange: String(List<DateTime> week)
AgendaStrings.time: String(DateTime moment)
AgendaStrings.timeStart: String(AgendaOccurrence occurrence)
AgendaStrings.timeEnd: String?(AgendaOccurrence occurrence)
AgendaStrings.hoursLabel: String(AgendaOccurrence occurrence)
AgendaStrings.events: String(int count)
AgendaStrings.attendees: String(int count)
AgendaStrings.initials: String(String name)
AgendaStrings.dayLabel: String(DateTime day, {required bool today, int? count})
AgendaStrings.separator: get String
AgendaStrings.title: get String
AgendaStrings.back: get String
AgendaStrings.refresh: get String
AgendaStrings.loading: get String
AgendaStrings.today: get String
AgendaStrings.newEvent: get String
AgendaStrings.previousWeek: get String
AgendaStrings.nextWeek: get String
AgendaStrings.happeningNow: get String
AgendaStrings.todayMark: get String
AgendaStrings.emptyTitle: get String
AgendaStrings.emptyMessage: get String
AgendaStrings.notice: String(AgendaNotice notice)
AgendaStrings.errorTitle: get String
AgendaStrings.errorMessage: get String
AgendaStrings.offlineTitle: get String
AgendaStrings.offlineMessage: get String
AgendaStrings.retry: get StringStrings
Every label in English, French and Arabic. The screen follows the closest Localizations; the same table is in the manifest, ready for your ARB files.
| Key | en | fr | ar |
|---|---|---|---|
agendaTitle | Agenda | Agenda | المفكرة |
agendaBack | Back | Retour | رجوع |
agendaRefresh | Refresh the agenda | Actualiser l’agenda | تحديث المفكرة |
agendaLoading | Loading your events | Chargement des évènements | جارٍ تحميل الأحداث |
agendaToday | Today | Aujourd’hui | اليوم |
agendaNewEvent | New event | Nouvel évènement | حدث جديد |
agendaPreviousWeek | Previous week | Semaine précédente | الأسبوع السابق |
agendaNextWeek | Next week | Semaine suivante | الأسبوع التالي |
agendaFirstWeekday | 7 | 1 | 6 |
agendaDate | {weekday}, {month} {day} | {weekday} {day} {month} | {weekday} {day} {month} |
agendaDateYear | {weekday}, {month} {day}, {year} | {weekday} {day} {month} {year} | {weekday} {day} {month} {year} |
agendaWeekRange | {first} – {last} | {first} – {last} | {first} – {last} |
agendaShortDate | {month} {day} | {day} {month} | {day} {month} |
agendaMonths | January,February,March,April,May,June,July,August,September,October,November,December | janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre | يناير,فبراير,مارس,أبريل,مايو,يونيو,يوليو,أغسطس,سبتمبر,أكتوبر,نوفمبر,ديسمبر |
agendaWeekdays | Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday | lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche | الاثنين,الثلاثاء,الأربعاء,الخميس,الجمعة,السبت,الأحد |
agendaWeekdaysShort | Mon,Tue,Wed,Thu,Fri,Sat,Sun | lun.,mar.,mer.,jeu.,ven.,sam.,dim. | الاثنين,الثلاثاء,الأربعاء,الخميس,الجمعة,السبت,الأحد |
agendaWeekdayInitials | M,T,W,T,F,S,S | L,M,M,J,V,S,D | ن,ث,ر,خ,ج,س,ح |
agendaHours12 | true | false | false |
agendaAm | AM | AM | ص |
agendaPm | PM | PM | م |
agendaOtherDay | {weekday} {time} | {weekday} {time} | {weekday} {time} |
agendaAllDay | All day | Journée | طوال اليوم |
agendaSpan | from {start} to {end} | de {start} à {end} | من {start} إلى {end} |
agendaMomentOtherDay | {time} on {date} | {time} le {date} | {time} يوم {date} |
agendaAllDayLabel | all day | toute la journée | طوال اليوم |
agendaAllDaySpan | all day, from {first} to {last} | toute la journée, du {first} au {last} | طوال اليوم، من {first} إلى {last} |
agendaNow | Now | En cours | جارٍ الآن |
agendaTodayMark | today | aujourd’hui | اليوم |
agendaSeparator | , | , | ، |
agendaEventsNone | no events | aucun évènement | لا أحداث |
agendaEventsOne | 1 event | 1 évènement | حدث واحد |
agendaEventsTwo | 2 events | 2 évènements | حدثان |
agendaEvents | {count} events | {count} évènements | {count} أحداث |
agendaEventsMany | {count} events | {count} évènements | {count} حدثًا |
agendaEventsOther | {count} events | {count} évènements | {count} حدث |
agendaAttendeesOne | 1 attendee | 1 participant | مشارك واحد |
agendaAttendeesTwo | 2 attendees | 2 participants | مشاركان |
agendaAttendees | {count} attendees | {count} participants | {count} مشاركين |
agendaAttendeesMany | {count} attendees | {count} participants | {count} مشاركًا |
agendaAttendeesOther | {count} attendees | {count} participants | {count} مشارك |
agendaEmptyTitle | Nothing planned | Rien de prévu | لا شيء مخطط له |
agendaEmptyMessage | No events on this day. | Aucun évènement ce jour-là. | لا أحداث في هذا اليوم. |
agendaRefreshFailed | Your agenda could not refresh. | L’agenda n’a pas pu se mettre à jour. | تعذّر تحديث المفكرة. |
agendaRefreshOffline | You are offline. The events shown may be out of date. | Vous êtes hors ligne. Les évènements affichés ne sont peut-être pas à jour. | أنت غير متصل. قد لا تكون الأحداث المعروضة محدّثة. |
agendaErrorTitle | Your events could not load | Impossible de charger les évènements | تعذّر تحميل الأحداث |
agendaErrorMessage | Try again in a moment. | Réessayez dans un instant. | أعد المحاولة بعد قليل. |
agendaOfflineTitle | You are offline | Vous êtes hors ligne | أنت غير متصل |
agendaOfflineMessage | Connect to see your events. | Connectez-vous pour voir vos évènements. | اتصل لعرض أحداثك. |
agendaRetry | Try again | Réessayer | أعد المحاولة |
Reference renders
The 16 images published with version 0.4.2, rendered by the shared harness on macOS with Flutter 3.47.7. Each shows every state side by side, at the size of an iPhone (390 × 844) or of an Android phone (412 × 915). fliin verify agenda compares your copy to them.
















Use it to
- show the events of one day in time order
- navigate the agenda from one date to the next
- show seven dates with a mark on the busy ones
- open an agenda event the user taps
- show an overnight event on both of its dates
- show my meetings for one day or for the whole week
- show who attends each meeting of the day and what it is about
- Not for
- a month grid to pick a date: use the calendar (calendar)
- things to do, to check off: use the task list (tasks)
- a single appointment in another list: use the event row (event-row)
- States