Fliin
On this page

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.

16 of 16 variants pass
Agenda, day state
Platform
Brightness
Text scale
Direction

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 agenda

Also 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.

Agenda, day state
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.

Agenda, overnight state
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.

Agenda, empty state
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.

Agenda, loading state
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.

Agenda, error state
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.

Agenda, offline state
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.

Agenda, add state
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 String

Strings

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.

Keyenfrar
agendaTitleAgendaAgendaالمفكرة
agendaBackBackRetourرجوع
agendaRefreshRefresh the agendaActualiser l’agendaتحديث المفكرة
agendaLoadingLoading your eventsChargement des évènementsجارٍ تحميل الأحداث
agendaTodayTodayAujourd’huiاليوم
agendaNewEventNew eventNouvel évènementحدث جديد
agendaPreviousWeekPrevious weekSemaine précédenteالأسبوع السابق
agendaNextWeekNext weekSemaine suivanteالأسبوع التالي
agendaFirstWeekday716
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}
agendaMonthsJanuary,February,March,April,May,June,July,August,September,October,November,Decemberjanvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembreيناير,فبراير,مارس,أبريل,مايو,يونيو,يوليو,أغسطس,سبتمبر,أكتوبر,نوفمبر,ديسمبر
agendaWeekdaysMonday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sundaylundi,mardi,mercredi,jeudi,vendredi,samedi,dimancheالاثنين,الثلاثاء,الأربعاء,الخميس,الجمعة,السبت,الأحد
agendaWeekdaysShortMon,Tue,Wed,Thu,Fri,Sat,Sunlun.,mar.,mer.,jeu.,ven.,sam.,dim.الاثنين,الثلاثاء,الأربعاء,الخميس,الجمعة,السبت,الأحد
agendaWeekdayInitialsM,T,W,T,F,S,SL,M,M,J,V,S,Dن,ث,ر,خ,ج,س,ح
agendaHours12truefalsefalse
agendaAmAMAMص
agendaPmPMPMم
agendaOtherDay{weekday} {time}{weekday} {time}{weekday} {time}
agendaAllDayAll dayJournéeطوال اليوم
agendaSpanfrom {start} to {end}de {start} à {end}من {start} إلى {end}
agendaMomentOtherDay{time} on {date}{time} le {date}{time} يوم {date}
agendaAllDayLabelall daytoute la journéeطوال اليوم
agendaAllDaySpanall day, from {first} to {last}toute la journée, du {first} au {last}طوال اليوم، من {first} إلى {last}
agendaNowNowEn coursجارٍ الآن
agendaTodayMarktodayaujourd’huiاليوم
agendaSeparator, , ،
agendaEventsNoneno eventsaucun évènementلا أحداث
agendaEventsOne1 event1 évènementحدث واحد
agendaEventsTwo2 events2 évènementsحدثان
agendaEvents{count} events{count} évènements{count} أحداث
agendaEventsMany{count} events{count} évènements{count} حدثًا
agendaEventsOther{count} events{count} évènements{count} حدث
agendaAttendeesOne1 attendee1 participantمشارك واحد
agendaAttendeesTwo2 attendees2 participantsمشاركان
agendaAttendees{count} attendees{count} participants{count} مشاركين
agendaAttendeesMany{count} attendees{count} participants{count} مشاركًا
agendaAttendeesOther{count} attendees{count} participants{count} مشارك
agendaEmptyTitleNothing plannedRien de prévuلا شيء مخطط له
agendaEmptyMessageNo events on this day.Aucun évènement ce jour-là.لا أحداث في هذا اليوم.
agendaRefreshFailedYour agenda could not refresh.L’agenda n’a pas pu se mettre à jour.تعذّر تحديث المفكرة.
agendaRefreshOfflineYou 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.أنت غير متصل. قد لا تكون الأحداث المعروضة محدّثة.
agendaErrorTitleYour events could not loadImpossible de charger les évènementsتعذّر تحميل الأحداث
agendaErrorMessageTry again in a moment.Réessayez dans un instant.أعد المحاولة بعد قليل.
agendaOfflineTitleYou are offlineVous êtes hors ligneأنت غير متصل
agendaOfflineMessageConnect to see your events.Connectez-vous pour voir vos évènements.اتصل لعرض أحداثك.
agendaRetryTry againRé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.

iOS · Light
Agenda, iOS, Light, text 1.0×, Left to right
Text 1.0× · Left to right
Agenda, iOS, Light, text 1.0×, Right to left
Text 1.0× · Right to left
Agenda, iOS, Light, text 2.0×, Left to right
Text 2.0× · Left to right
Agenda, iOS, Light, text 2.0×, Right to left
Text 2.0× · Right to left
iOS · Dark
Agenda, iOS, Dark, text 1.0×, Left to right
Text 1.0× · Left to right
Agenda, iOS, Dark, text 1.0×, Right to left
Text 1.0× · Right to left
Agenda, iOS, Dark, text 2.0×, Left to right
Text 2.0× · Left to right
Agenda, iOS, Dark, text 2.0×, Right to left
Text 2.0× · Right to left
Android · Light
Agenda, Android, Light, text 1.0×, Left to right
Text 1.0× · Left to right
Agenda, Android, Light, text 1.0×, Right to left
Text 1.0× · Right to left
Agenda, Android, Light, text 2.0×, Left to right
Text 2.0× · Left to right
Agenda, Android, Light, text 2.0×, Right to left
Text 2.0× · Right to left
Android · Dark
Agenda, Android, Dark, text 1.0×, Left to right
Text 1.0× · Left to right
Agenda, Android, Dark, text 1.0×, Right to left
Text 1.0× · Right to left
Agenda, Android, Dark, text 2.0×, Left to right
Text 2.0× · Left to right
Agenda, Android, Dark, text 2.0×, Right to left
Text 2.0× · Right to left

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
  • Day
  • Overnight
  • Empty
  • Loading
  • Error
  • Offline

Arrows to move, Enter to open, Escape to close.