Flutter日期格式化与相对时间显示插件lit_relative_date_time的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter日期格式化与相对时间显示插件 lit_relative_date_time 的使用

简介

lit_relative_date_time 是一个用于生成相对日期的 Flutter 包,它以本地化和人类可读的格式展示时间差异。该包可以帮助开发者轻松地在应用中显示相对时间。

截图

英文语言环境 德文语言环境
English Locale German Locale

工作原理

RelativeDateTime 接受两个 DateTime 对象并计算它们之间的时间差。这个相对时间差随后被用于本地化和格式化为人类可读的表达式。

使用方法

1. 设置本地化

首先,在 MaterialApp 中声明委托和受支持的语言环境,以便启用应用程序的本地化:

localizationsDelegates: [
  GlobalMaterialLocalizations.delegate,
  GlobalWidgetsLocalizations.delegate,
  GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
  const Locale('en'), // 英语
  const Locale('de'), // 德语
  const Locale('ru'), // 俄语
],

2. 创建 RelativeDateTime 对象

创建一个 RelativeDateTime 对象来表示两个时间点之间的相对时间差:

RelativeDateTime _relativeDateTime =
    RelativeDateTime(dateTime: DateTime.now(), other: _otherDateTime);

3. 初始化 RelativeDateFormat 对象

初始化 RelativeDateFormat 对象以格式化之前创建的 RelativeDateTime

RelativeDateFormat _relativeDateFormatter = RelativeDateFormat(
    Localizations.localeOf(context),
);

如果需要自定义本地化内容,可以通过传递 localizations 参数来实现:

RelativeDateLocalization customLocalization = RelativeDateLocalization(
  languageCode: 'en',
  timeUnitsSingular: ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'],
  timeUnitsPlural: ['seconds', 'minutes', 'hours', 'days', 'weeks', 'months', 'years'],
  prepositionPast: 'ago',
  prepositionFuture: 'in',
  atTheMoment: 'now',
  formatOrderPast: [FormatComponent.value, FormatComponent.unit, FormatComponent.preposition],
  formatOrderFuture: [FormatComponent.preposition, FormatComponent.value, FormatComponent.unit],
);

4. 格式化并显示相对时间

调用 RelativeDateFormatformat() 方法来格式化 RelativeDateTime 并将其显示在 Text 小部件中:

Text(_relativeDateFormatter.format(_relativeDateTime))

5. 动态更新相对时间

可以使用 AnimatedRelativeDateTimeBuilder 来动态更新相对时间值。该组件每秒渲染一次,允许每隔一秒更新一次构建器:

AnimatedRelativeDateTimeBuilder(
  date: _lastPressed!,
  builder: (relDateTime, formatted) {
    return Text(formatted);
  },
);

示例 Demo

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 lit_relative_date_time 插件:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:lit_relative_date_time/lit_relative_date_time.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'LitRelativeDateTime',
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en'),
        const Locale('de'),
        const Locale('ru'),
      ],
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  DateTime? _lastPressed;

  void _onPressed() {
    setState(() {
      _lastPressed = DateTime.now();
    });
  }

  void _addWeek() {
    setState(() {
      _lastPressed = _lastPressed!.add(Duration(days: 7));
    });
  }

  void _subtractWeek() {
    setState(() {
      _lastPressed = _lastPressed!.subtract(Duration(days: 7));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.black,
        title: Text("LitRelativeDateTime"),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _onPressed,
        child: Icon(_lastPressed != null ? Icons.restore : Icons.play_arrow),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.max,
        children: [
          Center(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: Text(
                "Last pressed:",
                textAlign: TextAlign.end,
              ),
            ),
          ),
          Center(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: _lastPressed != null
                  ? Column(
                      children: [
                        AnimatedRelativeDateTimeBuilder(
                          animateOpacity: true,
                          date: _lastPressed!,
                          builder: (relDateTime, formatted) {
                            return Text(formatted);
                          },
                        ),
                        SizedBox(height: 4.0),
                        ElevatedButton(
                          onPressed: _addWeek,
                          child: Text("add one week".toUpperCase()),
                        ),
                        ElevatedButton(
                          onPressed: _subtractWeek,
                          child: Text("sub one week".toUpperCase()),
                        ),
                      ],
                    )
                  : Text("Not Pressed Yet"),
            ),
          ),
        ],
      ),
    );
  }
}

以上代码展示了一个简单的 Flutter 应用,其中包含一个按钮,点击按钮后会记录当前时间,并通过 AnimatedRelativeDateTimeBuilder 显示相对于当前时间的时间差。用户还可以通过点击其他按钮来增加或减少时间。


更多关于Flutter日期格式化与相对时间显示插件lit_relative_date_time的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日期格式化与相对时间显示插件lit_relative_date_time的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用lit_relative_date_time插件来格式化日期和显示相对时间的示例代码。lit_relative_date_time插件允许你轻松地将日期格式化为相对时间(例如,“3天前”,“刚刚”等)。

首先,确保在你的pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  lit_relative_date_time: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来获取依赖项。

接下来,在你的Flutter应用中,你可以按照以下步骤使用lit_relative_date_time插件:

  1. 导入插件
import 'package:lit_relative_date_time/lit_relative_date_time.dart';
import 'package:intl/intl.dart';  // 用于日期格式化
  1. 创建并显示相对时间
import 'package:flutter/material.dart';
import 'package:lit_relative_date_time/lit_relative_date_time.dart';
import 'package:intl/intl.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Date Formatting and Relative Time Display',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  DateTime fixedDateTime = DateTime.now().subtract(Duration(days: 3));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Relative Date Time Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Fixed Date Time: ${DateFormat('yyyy-MM-dd HH:mm:ss').format(fixedDateTime)}',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            RelativeDateTimeText(
              dateTime: fixedDateTime,
              // 自定义相对时间格式,例如:3天前,刚刚,等等
              relativeDateTimeStyle: RelativeDateTimeStyle(
                  units: RelativeDateTimeUnits.narrow,
                  updateInterval: RelativeDateTimeUpdateInterval.adaptive),
            ),
          ],
        ),
      ),
    );
  }
}

在上面的示例中:

  • fixedDateTime是我们要格式化为相对时间的固定日期时间。
  • DateFormat('yyyy-MM-dd HH:mm:ss').format(fixedDateTime)用于将日期时间格式化为标准字符串格式。
  • RelativeDateTimeTextlit_relative_date_time插件提供的组件,用于显示相对时间。
  • relativeDateTimeStyle允许你自定义相对时间的显示样式和更新间隔。

这样,你就可以在你的Flutter应用中显示相对时间了。如果你希望更详细地自定义显示样式,可以查阅lit_relative_date_time插件的文档。

回到顶部