save_points_intl 1.2.0 copy "save_points_intl: ^1.2.0" to clipboard
save_points_intl: ^1.2.0 copied to clipboard

A comprehensive, modular, zero-dependency date/time library for Flutter with 7 languages, 100+ functions, and smart formatting.

example/main.dart

/// Example demonstrating the save_points_intl package
///
/// This example shows how to use various date and time formatting functions
/// from the save_points_intl library.
///
/// Run this example with:
/// ```bash
/// flutter run -d chrome
/// ```
library;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:save_points_intl/save_points_intl.dart';

/// Main entry point for the example application
void main() {
  runApp(const ExampleApp());
}

/// Example application demonstrating save_points_intl features
class ExampleApp extends StatelessWidget {
  /// Creates an instance of [ExampleApp]
  const ExampleApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Save Points Intl Example',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: const Color(0xFF0175C2),
        ),
        useMaterial3: true,
        cardTheme: CardThemeData(
          elevation: 0,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(16),
            side: BorderSide(
              color: Colors.grey.shade200,
            ),
          ),
        ),
      ),
      home: const ExampleHomePage(),
    );
  }
}

/// Home page demonstrating various date/time formatting features
class ExampleHomePage extends StatefulWidget {
  /// Creates an instance of [ExampleHomePage]
  const ExampleHomePage({super.key});

  @override
  State<ExampleHomePage> createState() => _ExampleHomePageState();
}

class _ExampleHomePageState extends State<ExampleHomePage> {
  final _scrollController = ScrollController();

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final now = DateTime.now();
    final yesterday = now.subtract(const Duration(days: 1));
    final tomorrow = now.add(const Duration(days: 1));
    final lastWeek = now.subtract(const Duration(days: 7));
    final nextMonth = DateTime(now.year, now.month + 1, now.day);
    final twoHoursAgo = now.subtract(const Duration(hours: 2));

    final theme = Theme.of(context);
    final colorScheme = theme.colorScheme;

    return Scaffold(
      appBar: AppBar(
        title: Row(
          children: [
            Icon(Icons.calendar_today, color: colorScheme.primary),
            const SizedBox(width: 12),
            const Text('Save Points Intl'),
          ],
        ),
        centerTitle: false,
        elevation: 0,
        scrolledUnderElevation: 1,
      ),
      body: CustomScrollView(
        controller: _scrollController,
        slivers: [
          SliverToBoxAdapter(
            child: Container(
              padding: const EdgeInsets.all(24),
              decoration: BoxDecoration(
                gradient: LinearGradient(
                  begin: Alignment.topLeft,
                  end: Alignment.bottomRight,
                  colors: [
                    colorScheme.primaryContainer,
                    colorScheme.primaryContainer.withValues(alpha: 0.5),
                  ],
                ),
              ),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    'DateTime Helpers',
                    style: theme.textTheme.headlineMedium?.copyWith(
                      fontWeight: FontWeight.bold,
                      color: colorScheme.onPrimaryContainer,
                    ),
                  ),
                  const SizedBox(height: 8),
                  Text(
                    'A powerful, modular, zero-dependency date/time library',
                    style: theme.textTheme.bodyLarge?.copyWith(
                      color:
                          colorScheme.onPrimaryContainer.withValues(alpha: 0.8),
                    ),
                  ),
                ],
              ),
            ),
          ),
          SliverPadding(
            padding: const EdgeInsets.all(16),
            sliver: SliverList(
              delegate: SliverChildListDelegate([
                _buildSection(
                  context,
                  Icons.calendar_month,
                  'Date Formatting',
                  [
                    _buildExample(
                      context,
                      'Short Date',
                      DateFormatters.formatDateShort(now),
                      'DateFormatters.formatDateShort(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Medium Date',
                      DateFormatters.formatDateMedium(now),
                      'DateFormatters.formatDateMedium(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Long Date',
                      DateFormatters.formatDateLong(now),
                      'DateFormatters.formatDateLong(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Full Date',
                      DateFormatters.formatDateFull(now),
                      'DateFormatters.formatDateFull(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Spanish Long Date',
                      DateFormatters.formatDateLong(now, 'es_ES'),
                      'DateFormatters.formatDateLong(DateTime.now(), \'es_ES\')',
                    ),
                    _buildExample(
                      context,
                      'Arabic Long Date',
                      DateFormatters.formatDateLong(now, 'ar_SA'),
                      'DateFormatters.formatDateLong(DateTime.now(), \'ar_SA\')',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.access_time,
                  'Time Formatting',
                  [
                    _buildExample(
                      context,
                      '24-Hour Format',
                      TimeFormatters.formatTime24Hour(now),
                      'TimeFormatters.formatTime24Hour(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      '12-Hour Format',
                      TimeFormatters.formatTime12Hour(now),
                      'TimeFormatters.formatTime12Hour(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      '24-Hour with Seconds',
                      TimeFormatters.formatTime24HourWithSeconds(now),
                      'TimeFormatters.formatTime24HourWithSeconds(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      '12-Hour with Seconds',
                      TimeFormatters.formatTime12HourWithSeconds(now),
                      'TimeFormatters.formatTime12HourWithSeconds(DateTime.now())',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.date_range,
                  'Date & Time Combined',
                  [
                    _buildExample(
                      context,
                      'Short DateTime',
                      TimeFormatters.formatDateTimeShort(now),
                      'TimeFormatters.formatDateTimeShort(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Medium DateTime',
                      TimeFormatters.formatDateTimeMedium(now),
                      'TimeFormatters.formatDateTimeMedium(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Long DateTime',
                      TimeFormatters.formatDateTimeLong(now),
                      'TimeFormatters.formatDateTimeLong(DateTime.now())',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.schedule,
                  'Relative Time',
                  [
                    _buildExample(
                      context,
                      '2 Hours Ago',
                      RelativeTime.getRelativeTime(twoHoursAgo),
                      'RelativeTime.getRelativeTime(DateTime.now().subtract(Duration(hours: 2)))',
                    ),
                    _buildExample(
                      context,
                      'Yesterday',
                      RelativeTime.getRelativeTime(yesterday),
                      'RelativeTime.getRelativeTime(yesterday)',
                    ),
                    _buildExample(
                      context,
                      'Tomorrow',
                      RelativeTime.getRelativeTime(tomorrow),
                      'RelativeTime.getRelativeTime(tomorrow)',
                    ),
                    _buildExample(
                      context,
                      'Last Week',
                      RelativeTime.getRelativeTime(lastWeek),
                      'RelativeTime.getRelativeTime(lastWeek)',
                    ),
                    _buildExample(
                      context,
                      'Spanish Relative',
                      RelativeTime.getRelativeTime(yesterday, 'es_ES'),
                      'RelativeTime.getRelativeTime(yesterday, \'es_ES\')',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.auto_awesome,
                  'Smart Formatting',
                  [
                    _buildExample(
                      context,
                      'Today',
                      SmartFormatters.formatSmart(now),
                      'SmartFormatters.formatSmart(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Yesterday',
                      SmartFormatters.formatSmart(yesterday),
                      'SmartFormatters.formatSmart(yesterday)',
                    ),
                    _buildExample(
                      context,
                      'Tomorrow',
                      SmartFormatters.formatSmart(tomorrow),
                      'SmartFormatters.formatSmart(tomorrow)',
                    ),
                    _buildExample(
                      context,
                      'Last Week',
                      SmartFormatters.formatSmart(lastWeek),
                      'SmartFormatters.formatSmart(lastWeek)',
                    ),
                    _buildExample(
                      context,
                      'Next Month',
                      SmartFormatters.formatSmart(nextMonth),
                      'SmartFormatters.formatSmart(nextMonth)',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.compare_arrows,
                  'Date Comparisons',
                  [
                    _buildExample(
                      context,
                      'Is Today?',
                      DateComparisons.isToday(now).toString(),
                      'DateComparisons.isToday(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Is Yesterday?',
                      DateComparisons.isYesterday(yesterday).toString(),
                      'DateComparisons.isYesterday(yesterday)',
                    ),
                    _buildExample(
                      context,
                      'Is Tomorrow?',
                      DateComparisons.isTomorrow(tomorrow).toString(),
                      'DateComparisons.isTomorrow(tomorrow)',
                    ),
                    _buildExample(
                      context,
                      'Is Weekend?',
                      DateComparisons.isWeekend(now).toString(),
                      'DateComparisons.isWeekend(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Is Weekday?',
                      DateComparisons.isWeekday(now).toString(),
                      'DateComparisons.isWeekday(DateTime.now())',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.calculate,
                  'Date Calculations',
                  [
                    _buildExample(
                      context,
                      'Start of Day',
                      TimeFormatters.formatDateTimeMedium(
                        DateCalculations.startOfDay(now),
                      ),
                      'DateCalculations.startOfDay(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'End of Day',
                      TimeFormatters.formatDateTimeMedium(
                        DateCalculations.endOfDay(now),
                      ),
                      'DateCalculations.endOfDay(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Start of Week',
                      DateFormatters.formatDateMedium(
                        DateCalculations.startOfWeek(now),
                      ),
                      'DateCalculations.startOfWeek(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Start of Month',
                      DateFormatters.formatDateMedium(
                        DateCalculations.startOfMonth(now),
                      ),
                      'DateCalculations.startOfMonth(DateTime.now())',
                    ),
                    _buildExample(
                      context,
                      'Add 5 Business Days',
                      DateFormatters.formatDateMedium(
                        DateCalculations.addBusinessDays(now, 5),
                      ),
                      'DateCalculations.addBusinessDays(DateTime.now(), 5)',
                    ),
                  ],
                ),
                _buildSection(
                  context,
                  Icons.code,
                  'Date Parsing',
                  [
                    _buildExample(
                      context,
                      'Parse ISO 8601',
                      DateFormatters.formatDateMedium(
                        DateParsers.parseFlexible('2025-12-01') ?? now,
                      ),
                      'DateParsers.parseFlexible(\'2025-12-01\')',
                    ),
                    _buildExample(
                      context,
                      'Parse Custom Format',
                      DateFormatters.formatDateMedium(
                        DateParsers.parseDate('2025-12-01') ?? now,
                      ),
                      'DateParsers.parseDate(\'2025-12-01\')',
                    ),
                    _buildExample(
                      context,
                      'Is Valid Date?',
                      DateParsers.isValidDate('2025-12-01').toString(),
                      'DateParsers.isValidDate(\'2025-12-01\')',
                    ),
                  ],
                ),
                const SizedBox(height: 24),
              ]),
            ),
          ),
        ],
      ),
    );
  }

  /// Builds a section with a title and list of examples
  Widget _buildSection(
    BuildContext context,
    IconData icon,
    String title,
    List<Widget> examples,
  ) {
    final theme = Theme.of(context);
    final colorScheme = theme.colorScheme;

    return Card(
      margin: const EdgeInsets.only(bottom: 16),
      child: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                Container(
                  padding: const EdgeInsets.all(8),
                  decoration: BoxDecoration(
                    color: colorScheme.primaryContainer,
                    borderRadius: BorderRadius.circular(8),
                  ),
                  child: Icon(
                    icon,
                    color: colorScheme.onPrimaryContainer,
                    size: 20,
                  ),
                ),
                const SizedBox(width: 12),
                Text(
                  title,
                  style: theme.textTheme.titleLarge?.copyWith(
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ],
            ),
            const SizedBox(height: 16),
            ...examples,
          ],
        ),
      ),
    );
  }

  /// Builds an example item showing code and result
  Widget _buildExample(
    BuildContext context,
    String label,
    String result,
    String code,
  ) {
    final theme = Theme.of(context);
    final colorScheme = theme.colorScheme;
    final isDark = theme.brightness == Brightness.dark;

    return Padding(
      padding: const EdgeInsets.only(bottom: 16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            children: [
              Text(
                label,
                style: theme.textTheme.titleSmall?.copyWith(
                  fontWeight: FontWeight.w600,
                  color: colorScheme.primary,
                ),
              ),
              const Spacer(),
              IconButton(
                icon: const Icon(Icons.copy, size: 18),
                tooltip: 'Copy code',
                padding: EdgeInsets.zero,
                constraints: const BoxConstraints(),
                onPressed: () {
                  Clipboard.setData(ClipboardData(text: code));
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(
                      content: const Row(
                        children: [
                          Icon(Icons.check_circle, color: Colors.white),
                          SizedBox(width: 8),
                          Text('Code copied to clipboard'),
                        ],
                      ),
                      behavior: SnackBarBehavior.floating,
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(8),
                      ),
                      duration: const Duration(seconds: 2),
                    ),
                  );
                },
              ),
            ],
          ),
          const SizedBox(height: 8),
          Container(
            width: double.infinity,
            padding: const EdgeInsets.all(16),
            decoration: BoxDecoration(
              color: isDark
                  ? Colors.grey.shade900
                  : colorScheme.surfaceContainerHighest,
              borderRadius: BorderRadius.circular(12),
              border: Border.all(
                color: isDark ? Colors.grey.shade800 : Colors.grey.shade200,
              ),
            ),
            child: SelectableText(
              result,
              style: theme.textTheme.bodyLarge?.copyWith(
                fontFamily: 'monospace',
                fontWeight: FontWeight.w500,
                color: colorScheme.onSurface,
              ),
            ),
          ),
          const SizedBox(height: 8),
          Container(
            width: double.infinity,
            padding: const EdgeInsets.all(12),
            decoration: BoxDecoration(
              color: isDark
                  ? Colors.grey.shade800.withValues(alpha: 0.5)
                  : Colors.grey.shade50,
              borderRadius: BorderRadius.circular(8),
            ),
            child: SelectableText(
              code,
              style: theme.textTheme.bodySmall?.copyWith(
                fontFamily: 'monospace',
                color: isDark
                    ? Colors.grey.shade400
                    : colorScheme.onSurface.withValues(alpha: 0.7),
              ),
            ),
          ),
        ],
      ),
    );
  }
}
1
likes
160
points
256
downloads

Publisher

unverified uploader

Weekly Downloads

A comprehensive, modular, zero-dependency date/time library for Flutter with 7 languages, 100+ functions, and smart formatting.

Repository (GitHub)
View/report issues

Topics

#datetime #date-formatting #i18n #localization #utilities

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on save_points_intl