agenda_calendar_infinite 0.1.0 copy "agenda_calendar_infinite: ^0.1.0" to clipboard
agenda_calendar_infinite: ^0.1.0 copied to clipboard

A Flutter calendar widget library with infinite scroll support, including vertical calendar and horizontal Gantt chart components.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:agenda_calendar_infinite/agenda_calendar_infinite.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Agenda Calendar Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _selectedIndex = 0;

  final List<Widget> _pages = const [
    CalendarExamplePage(),
    GanttChartExamplePage(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_selectedIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _selectedIndex,
        onTap: (index) {
          setState(() {
            _selectedIndex = index;
          });
        },
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.calendar_month),
            label: '日历视图',
          ),
          BottomNavigationBarItem(icon: Icon(Icons.bar_chart), label: '甘特图视图'),
        ],
      ),
    );
  }
}

class CalendarExamplePage extends StatefulWidget {
  const CalendarExamplePage({super.key});

  @override
  State<CalendarExamplePage> createState() => _CalendarExamplePageState();
}

class _CalendarExamplePageState extends State<CalendarExamplePage> {
  DateTime? _selectedDay;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('日历视图示例'),
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
      ),
      body: VerticalCalendar(
        selectedDay: _selectedDay,
        minDate: DateTime(2020, 1, 1),
        maxDate: DateTime(2030, 12, 31),
        onDaySelected: (selectedDay, focusedDay) {
          setState(() {
            _selectedDay = selectedDay;
          });
        },
        eventsBuilder: (month) {
          return _generateSampleEvents(month);
        },
      ),
    );
  }

  List<CalendarEvent> _generateSampleEvents(DateTime month) {
    final now = DateTime.now();
    final events = <CalendarEvent>[];

    events.add(
      CalendarEvent(
        id: '1',
        title: '会议',
        startDate: DateTime(month.year, month.month, 5),
        endDate: DateTime(month.year, month.month, 7),
        color: Colors.blue,
      ),
    );

    events.add(
      CalendarEvent(
        id: '2',
        title: '项目截止',
        startDate: DateTime(month.year, month.month, 12),
        endDate: DateTime(month.year, month.month, 12),
        color: Colors.red,
      ),
    );

    events.add(
      CalendarEvent(
        id: '3',
        title: '跨周活动',
        startDate: DateTime(month.year, month.month, 20),
        endDate: DateTime(month.year, month.month, 25),
        color: Colors.green,
      ),
    );

    if (month.month == now.month && month.year == now.year) {
      events.add(
        CalendarEvent(
          id: '4',
          title: '今天的事件',
          startDate: DateTime(now.year, now.month, now.day),
          endDate: DateTime(now.year, now.month, now.day),
          color: Colors.orange,
        ),
      );
    }

    return events;
  }
}

class GanttChartExamplePage extends StatefulWidget {
  const GanttChartExamplePage({super.key});

  @override
  State<GanttChartExamplePage> createState() => _GanttChartExamplePageState();
}

class _GanttChartExamplePageState extends State<GanttChartExamplePage> {
  late final List<CalendarEvent> _events;

  @override
  void initState() {
    super.initState();
    _events = _generateEvents();
  }

  List<CalendarEvent> _generateEvents() {
    final now = DateTime.now();
    final events = <CalendarEvent>[];

    // 生成 50 个随机事件
    final colors = [
      Colors.blue,
      Colors.purple,
      Colors.green,
      Colors.orange,
      Colors.red,
      Colors.teal,
      Colors.indigo,
      Colors.pink,
      Colors.cyan,
      Colors.amber,
    ];

    for (int i = 0; i < 50; i++) {
      final startDay = (i * 2) - 20 + (i % 10);
      final duration = 2 + (i % 8);
      final color = colors[i % colors.length];

      events.add(
        CalendarEvent(
          id: '$i',
          title: '任务 ${i + 1}',
          startDate: now.add(Duration(days: startDay)),
          endDate: now.add(Duration(days: startDay + duration)),
          color: color,
        ),
      );
    }

    return events;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('水平日历视图示例'),
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
      ),
      body: HorizontalCalendar(
        events: _events,
        dayWidth: 120,
        eventHeight: 40,
        rowHeight: 60,
        headerHeight: 60,
        minDate: DateTime.now().subtract(const Duration(days: 60)),
        maxDate: DateTime.now().add(const Duration(days: 120)),
        onEventTap: (event) {
          ScaffoldMessenger.of(
            context,
          ).showSnackBar(SnackBar(content: Text('点击了事件: ${event.title}')));
        },
      ),
    );
  }
}
0
likes
140
points
61
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A Flutter calendar widget library with infinite scroll support, including vertical calendar and horizontal Gantt chart components.

Repository (GitHub)
View/report issues

License

BSD-3-Clause (license)

Dependencies

flutter, flutter_localizations, intl

More

Packages that depend on agenda_calendar_infinite