Creare una calendario in Flutter con table_calendar
table_calendar è una libreria per Flutter per creare una calendario da visualizzare nelle nostre app.
In questo articolo vediamo un esempio, con degli eventi creati in maniera randomica direttamente da codice.
Per installarla:
flutter pub add table_calendar
Qui sotto il codice:
import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:table_calendar/table_calendar.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late final ValueNotifier<List<Event>> _selectedEvents;
CalendarFormat _calendarFormat = CalendarFormat.month;
DateTime _focusedDay = DateTime.now();
DateTime? _selectedDay;
@override
void initState() {
super.initState();
_selectedDay = _focusedDay;
_selectedEvents = ValueNotifier(_getEventiPerGiorno(_selectedDay!));
}
@override
void dispose() {
_selectedEvents.dispose();
super.dispose();
}
List<Event> _getEventiPerGiorno(DateTime day) {
final oggi = DateTime.now();
final primoGiorno = DateTime(oggi.year, oggi.month - 3, oggi.day);
final kEventSource = {
for (var item in List.generate(50, (index) => index))
DateTime.utc(primoGiorno.year, primoGiorno.month, item * 5): List.generate(
item % 4 + 1,
(index) => Event('Evento $item | ${index + 1}'),
)
}..addAll({
oggi: [
const Event('Oggi's Evento 1'),
const Event('Oggi's Evento 2'),
],
});
final eventi = LinkedHashMap<DateTime, List<Event>>(
equals: isSameDay,
hashCode: _getHashCode,
)..addAll(kEventSource);
return eventi[day] ?? [];
}
int _getHashCode(DateTime key) {
return key.day * 1000000 + key.month * 10000 + key.year;
}
void _onDaySelected(DateTime selectedDay, DateTime focusedDay) {
if (!isSameDay(_selectedDay, selectedDay)) {
setState(() {
_selectedDay = selectedDay;
_focusedDay = focusedDay;
});
_selectedEvents.value = _getEventiPerGiorno(selectedDay);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.primary,
title: Text(widget.title),
),
body: Column(
children: [
TableCalendar(
firstDay: DateTime.utc(2010, 10, 16),
lastDay: DateTime.utc(2030, 3, 14),
focusedDay: DateTime.now(),
calendarFormat: _calendarFormat,
startingDayOfWeek: StartingDayOfWeek.monday,
calendarStyle: const CalendarStyle(
outsideDaysVisible: false,
),
eventLoader: _getEventiPerGiorno,
selectedDayPredicate: (day) {
return isSameDay(_selectedDay, day);
},
onDaySelected: _onDaySelected,
onFormatChanged: (format) {
if (_calendarFormat != format) {
setState(() {
_calendarFormat = format;
});
}
},
onPageChanged: (focusedDay) {
_focusedDay = focusedDay;
},
),
const SizedBox(height: 8.0),
Expanded(
child: ValueListenableBuilder<List<Event>>(
valueListenable: _selectedEvents,
builder: (context, value, _) {
return ListView.builder(
itemCount: value.length,
itemBuilder: (context, index) {
return Container(
margin: const EdgeInsets.symmetric(
horizontal: 12.0,
vertical: 4.0,
),
decoration: BoxDecoration(
border: Border.all(),
borderRadius: BorderRadius.circular(12.0),
),
child: ListTile(
onTap: () => print('${value[index]}'),
title: Text('${value[index]}'),
),
);
},
);
},
),
),
],
),
);
}
}
class Event {
final String title;
const Event(this.title);
@override
String toString() => title;
}
Enjoy!
dart flutter table_calendar
Commentami!