save_points_intl 1.2.0
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),
),
),
),
],
),
);
}
}