Flutter时间格式化插件timeago_flutter的使用

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

Flutter时间格式化插件timeago_flutter的使用

timeago 是一个Dart库,它能够将日期转换为人类可读的文本。例如,它可以将 2020-12-12 18:30 这样的日期显示为 "now", "an hour ago""~1y" 等等。

timeago pub package 核心库
timeago_flutter pub package Flutter组件

使用方法

最简单的方式是通过顶级函数 format(date) 来使用这个库:

import 'package:timeago/timeago.dart' as timeago;

main() {
    final fifteenAgo = DateTime.now().subtract(Duration(minutes: 15));

    print(timeago.format(fifteenAgo)); // 15 minutes ago
    print(timeago.format(fifteenAgo, locale: 'en_short')); // 15m
    print(timeago.format(fifteenAgo, locale: 'es')); // hace 15 minutos
}

注意事项

timeago 库默认只包含 enes 两种语言的消息。要添加更多支持的语言,请使用 timeago.setLocaleMessages(..)。参见locale messages

本库使用ISO 639-1语言代码来标识语言。更多信息请参阅ISO 639-1

添加本地化

timeago.setLocaleMessages('fr', timeago.FrMessages()); // 添加法语消息

print(timeago.format(fifteenAgo, locale: 'es')); // environ 15 minutes

覆盖本地化或添加自定义消息

// 覆盖 "en" 本地化消息为更精确和简短的自定义消息
timeago.setLocaleMessages('en', MyCustomMessages());

// my_custom_messages.dart
class MyCustomMessages implements LookupMessages {
  @override String prefixAgo() => '';
  @override String prefixFromNow() => '';
  @override String suffixAgo() => '';
  @override String suffixFromNow() => '';
  @override String lessThanOneMinute(int seconds) => 'now';
  @override String aboutAMinute(int minutes) => '${minutes}m';
  @override String minutes(int minutes) => '${minutes}m';
  @override String aboutAnHour(int minutes) => '${minutes}m';
  @override String hours(int hours) => '${hours}h';
  @override String aDay(int hours) => '${hours}h';
  @override String days(int days) => '${days}d';
  @override String aboutAMonth(int days) => '${days}d';
  @override String months(int months) => '${months}mo';
  @override String aboutAYear(int year) => '${year}y';
  @override String years(int years) => '${years}y';
  @override String wordSeparator() => ' ';
}

Scope

为了保持库的简洁并尽量减少维护工作,我们希望:

  1. 提供一个单一的 format 函数,将日期转换为人类可读的值。
  2. 提供抽象接口,允许用户添加自己的语言或根据需要覆盖它们。
  3. 提供由社区贡献的语言,用户可以根据需要添加这些语言,而不是默认添加所有语言。
  4. 库不应该依赖任何其他依赖项。

timeago_flutter 组件

timeago_flutter 提供了以下Flutter组件:

  • Timeago
  • TimerRefresh
  • TimerRefreshWidget

实例演示

import 'package:flutter/material.dart';
import 'package:timeago/timeago.dart' as timeago;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Timeago Demo'),
        ),
        body: Center(
          child: Timeago(
            builder: (context, date) {
              return Text(
                timeago.format(date),
                style: TextStyle(fontSize: 20),
              );
            },
            date: DateTime.now().subtract(Duration(days: 2)),
          ),
        ),
      ),
    );
  }
}

本地开发

  1. 安装Melos(链接):

    dart pub global activate melos
    
  2. 启动依赖:

    melos bootstrap
    
  3. 在VSCode或Webstorm中打开所需的包

实时演示

你可以在这里查看实时演示:Live Demo


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

1 回复

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


当然,以下是如何在Flutter项目中使用timeago_flutter插件来格式化时间显示的代码案例。timeago_flutter是一个强大的插件,它可以将时间戳或DateTime对象格式化为相对时间字符串(例如,“3分钟前”,“2小时前”等)。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加timeago_flutter的依赖:

dependencies:
  flutter:
    sdk: flutter
  timeago_flutter: ^4.0.0  # 请确保使用最新版本,版本号可能会有所不同

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

2. 导入插件

在你的Dart文件中导入timeago_flutter插件:

import 'package:timeago_flutter/timeago_flutter.dart' as timeago;

3. 使用插件

以下是一个完整的示例,展示了如何使用timeago_flutter来格式化时间:

import 'package:flutter/material.dart';
import 'package:timeago_flutter/timeago_flutter.dart' as timeago;
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter TimeAgo Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TimeAgoDemo(),
    );
  }
}

class TimeAgoDemo extends StatefulWidget {
  @override
  _TimeAgoDemoState createState() => _TimeAgoDemoState();
}

class _TimeAgoDemoState extends State<TimeAgoDemo> {
  DateTime currentTime = DateTime.now();
  Timer? timer;

  @override
  void initState() {
    super.initState();
    // 每秒更新一次时间,以展示timeago的实时更新效果
    timer = Timer.periodic(Duration(seconds: 1), (Timer _) {
      setState(() {
        currentTime = DateTime.now();
      });
    });
  }

  @override
  void dispose() {
    timer?.cancel();
    timer = null;
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TimeAgo Flutter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Time: ${currentTime.toLocal()}',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Text(
              'Formatted Time: ${timeago.format(currentTime)}',
              style: TextStyle(fontSize: 24, color: Colors.blue),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 添加依赖:在pubspec.yaml中添加timeago_flutter
  2. 导入插件:在Dart文件中使用import 'package:timeago_flutter/timeago_flutter.dart' as timeago;导入插件。
  3. 使用插件
    • 使用DateTime.now()获取当前时间。
    • 使用timeago.format(currentTime)将当前时间格式化为相对时间字符串。
    • 通过setState每秒更新一次时间,以展示timeago的实时更新效果。

这个示例展示了如何在Flutter应用中使用timeago_flutter插件来格式化并显示相对时间。你可以根据需求对代码进行修改和扩展。

回到顶部