Как да опишем времеви отпечатъци въз основа на текущи разлики във времето, като в списъка с известия

В предишния си блог клонирам потребителския интерфейс на носителя за уведомяване (версия за Android). Статията обясняваше как конвертирам изображение на екранна снимка във Flutter код.



Ако сте прочели статията по-горе, подчертах в края на стъпка 2 относно клеймото за време на уведомяване. А сега, това е продължението на тази статия.

До края на тази статия ще можем да опишем клеймото за време въз основа на текущата часова разлика. Например в горното изображение на корицата има 2 известия. Първото известие е описано като преди 17 минути, а второто известие от Twitter е преди 29 минути. С класа DateTimeще създадем нов метод extensionза да можем да опишем часа без допълнителни пакети.

На първо място, този метод е вдъхновен от примера на израз за превключване на #GoogleIO2023. За да е автентичен, показвам екранни снимки от видеото.

От извадката в тази снимка методът обработва само часови разлики за дни. Ще го взема и ще го извлека като метод за обработка на дни.

  • Дни

ако използвате dart v3.x, тогава можете да използвате същото като в примера:

String dayHandler2(Duration diff) =>  switch(diff) {
  Duration(inDays: -1) => "Yesterday",
  Duration(inDays: 1) => "Tomorrow",
  Duration(inDays: 0) => "Today",
  Duration(inDays: int d, isNegative: true) => "${d.abs()} days ago",
  Duration(inDays: int d, isNegative: false) => "$d days from now",
};

но ако все още използвате dart v2.x, което е, че изразът за превключване все още не е наличен, можете да използвате този израз за превключване.

String dayHandler(Duration day) {
  String result = "";
  switch (day) {
    case Duration(inDays: -1):
      result = "Yesterday";
    case Duration(inDays: 1):
      result = "Tomorrow";
    case Duration(inDays: 0):
      result = "Today";
    case Duration(inDays: int d, isNegative: true):
      result = "${d.abs()} days ago";
    case Duration(inDays: int d, isNegative: false):
      result = "$d days from now";
  }
  return result;
}
  • Час

В тази част трябва да се справим с условието, когато часовата разлика е между 59 минути и 24 часа.

Правя го възможно най-просто, като предавам целочислената стойност на времевата разлика. И така, имам метод като по-долу:

String hrsHandler(int hrs) {
  return hrs.isNegative ? "${hrs.abs()} hours ago" : "$hrs hours from now";
}

Когато цялото число hrs е отрицателно, това означава, че разликата е просрочена, връщаме x hours ago. Но за положителните, това означава няколко часа предстоящи. Връщаме x hours from now.

  • Минути

В този случай искаме да обработим, когато времевата разлика е по-малка от 60 минути. Методът ще бъде така:

String minsHandler(int min) {
  return min.isNegative ? "${min.abs()} minutes ago" : "$min minutes from now";
}

Той използва същата логика като в hrsHanlder, като проверява за отрицателни или положителни стойности. След това връща клеймо за време, описано от неговата стойност.

Можете да създадете друг манипулатор за по-пълен метод. Например monthHandler или yearHandler . Но засега ще покривам само дни, часове и минути.

Чрез прилагане на метода по-горе, крайният резултат от метода разширениеще бъде като този:

extension DescribeTimeDiff on DateTime {
  String getDifferences() {
    final now = DateTime.now();
    final diff = difference(DateTime(
        now.year, now.month, now.day, now.hour, now.minute, now.second));
    String a = diff.inHours.abs() > 23
        // ? dayHandler(diff) // if you use dart 2 
        ? dayHandler2(diff) // if you use dart 3
        : diff.inHours.abs() < 24 && diff.inMinutes.abs() > 59
            ? hrsHandler(diff.inHours)
            : minsHandler(diff.inMinutes);
    return a;
  }
}

Ако се чудите защо все още използвам if-else в този метод, това е защото изрази за превключване и изражения за превключване изискват постоянна стойност, за да бъдат изразени. Опитах няколко метода, за да го опростя, използвайки изрази за превключване. Но ми свършиха идеите. Чувствайте се свободни да оставяте коментари, ако имате някакви идеи за това.

Пълният код можете да видите тук и да го изпробвате сами на Dartpad:

https://dartpad.dev/?id=b213bd69e1d44e2f0263081f9954af6a

Добре, вече тестваме метода и работи добре. Сега го внедряваме в потребителския интерфейс.

ето стари данни, които имам:

List<NotifModel> notifData = [
  NotifModel(
      id: 1,
      userName: "Pmatatias",
      notifType: NotifType(id: 1, name: "responded to"),
      articleTitle:"The article title will be here",
      time: "59 minutes ago"),

и сега използваме форматиран низ за данните за времето.

List<NotifModel> notifData = [
  NotifModel(
      id: 1,
      userName: "Pmatatias",
      notifType: NotifType(id: 1, name: "responded to"),
      articleTitle:"The article title will be here",
      time: "2023-05-30 16:23:32.000"),

как да използвам?

Първо анализирайте датата на форматирания низ към обекта DateTime. И след това опишете времето с метода удължаване. И не забравяйте да import пътя, ако поставите метода разширениев отделен файл.

import 'your path file where you put the time_difference method';

Text(DateTime.parse(data.time).getDifferences())

Сега нека видим крайния резултат от клонирането на потребителския интерфейс за средно уведомяване с описан времеви печат.

Благодаря ти, че имаш края. Това е моята 6-та статия за метода удължаване. Можете да прочетете предишния метод за разширение от предложение в края на тази статия.

Между другото, аз също събирам всички методи за разширение в хранилището на GitHub. Можете да го получите чрез хранилището по-долу. Чувствайте се свободни да допринесете, ако имате метод на разширениеи искате да го споделите.



Ако ви харесва тази статия, не забравяйте да ръкопляскате 👏👏👏👏👏👏👏👏👏👏

И не се колебайте да оставите коментари по-долу. 😃

Приятно четене!!!