【问题标题】:Flutter Parse Method ExplanationFlutter Parse 方法说明
【发布时间】:2020-11-28 16:53:02
【问题描述】:

我有一个格式为 Month-Day-4DigitYear 的字符串日期,我想在 Flutter 中将其转换为 DateTime。我是新手编码员,我很难理解api.flutter.dev Parse method example.

下面是例子。我只是有几个问题。当我刚刚创建一个类并放入此函数时,Android Studio 会引发多个错误。我想我理解不可为空的问题,所以我删除了!和 ?到处都是标记。

我的问题是:_parseFormat、_brokenDownDateToValue、_withValue 是什么?

All 都给出错误,只声明前两个并删除 _withValue 似乎并没有解决问题,尽管删除了所有错误。就好像他们遗漏了我遗漏的关键部分,或者我需要导入一个我和 Android Studio 都不知道的包。任何人都可以解密这个吗?我对 Flutter 的文档感到非常沮丧,因为它似乎总是提供 80% 的所需信息,假设你已经对除了他们正在讨论的这个单一主题之外的所有其他主题有洞察力。在阅读手册之前必须成为专业人士。

    // TODO(lrn): restrict incorrect values like  2003-02-29T50:70:80.
    // Or not, that may be a breaking change.
    static DateTime parse(String formattedString) {
      var re = _parseFormat;
      Match? match = re.firstMatch(formattedString);
      if (match != null) {
    int parseIntOrZero(String? matched) {
      if (matched == null) return 0;
      return int.parse(matched);
    }

    // Parses fractional second digits of '.(\d+)' into the combined
    // microseconds. We only use the first 6 digits because of DateTime
    // precision of 999 milliseconds and 999 microseconds.
    int parseMilliAndMicroseconds(String? matched) {
      if (matched == null) return 0;
      int length = matched.length;
      assert(length >= 1);
      int result = 0;
      for (int i = 0; i < 6; i++) {
        result *= 10;
        if (i < matched.length) {
          result += matched.codeUnitAt(i) ^ 0x30;
        }
      }
      return result;
    }

    int years = int.parse(match[1]!);
    int month = int.parse(match[2]!);
    int day = int.parse(match[3]!);
    int hour = parseIntOrZero(match[4]);
    int minute = parseIntOrZero(match[5]);
    int second = parseIntOrZero(match[6]);
    int milliAndMicroseconds = parseMilliAndMicroseconds(match[7]);
    int millisecond =
        milliAndMicroseconds ~/ Duration.microsecondsPerMillisecond;
    int microsecond = milliAndMicroseconds
        .remainder(Duration.microsecondsPerMillisecond) as int;
    bool isUtc = false;
    if (match[8] != null) {
      // timezone part
      isUtc = true;
      String? tzSign = match[9];
      if (tzSign != null) {
        // timezone other than 'Z' and 'z'.
        int sign = (tzSign == '-') ? -1 : 1;
        int hourDifference = int.parse(match[10]!);
        int minuteDifference = parseIntOrZero(match[11]);
        minuteDifference += 60 * hourDifference;
        minute -= sign * minuteDifference;
      }
    }
    int? value = _brokenDownDateToValue(years, month, day, hour, minute,
        second, millisecond, microsecond, isUtc);
    if (value == null) {
      throw FormatException("Time out of range", formattedString);
    }
    return DateTime._withValue(value, isUtc: isUtc);
  } else {
    throw FormatException("Invalid date format", formattedString);
  }
}

【问题讨论】:

标签: flutter parsing


【解决方案1】:

我的问题是:_parseFormat、_brokenDownDateToValue、_withValue 是什么?

这些是在库中其他地方声明的对象或函数,它们是私有的(_ 作为第一个字符将对象和函数声明为私有),因此未在文档中显示。

  • _parseFormat 似乎是一个正则表达式。

  • _brokenDownDateToValue 似乎是一个函数。

  • _withValue 是一个命名构造函数。

如果您想将日期字符串解析为 DateTime 对象,我认为您想要使用以下内容。

var date = "11-28-2020"; // Month-Day-4DigitYear
var dateTime = DateTime.parse(date.split('-').reversed.join());

请参阅https://api.flutter.dev/flutter/dart-core/DateTime/parse.html 以获取要解析的接受字符串。

【讨论】:

  • 我想我很难理解当三个值未定义时该示例应该如何有用。 _parseFormat 和 _brokenDownDateToValue 和 _withValue 在我能找到的任何文档中都找不到。初学者应该如何使用它?
  • 感谢您的回复。我解决了我原来的具体问题。但是,提出这个问题是为了更好地理解如何阅读和使用 Flutter 官方文档。由于这三个值未定义,我不明白如何使用此文档来获得任何东西。
  • @jbryanh 当涉及到关于如何使用 lib 的文档时,您通常不必再看“主”页面:api.flutter.dev/flutter/dart-core/DateTime-class.html 它向您展示了一些示例和信息。如果您想知道特定方法的工作原理,您可以研究一下。例如,api.flutter.dev/flutter/dart-core/DateTime/parse.html 为您提供了有关该方法以及支持哪些格式的更多信息。您很少需要使用文档的“实施”部分。如果您使用上述方法,这只是向您展示 lib 中发生的情况。希望这会有所帮助。
  • 感谢@Er1 的回复。你知道,你现在两次引用了“lib”。也许这就是我所缺少的?是否有一个包含我需要参考的所有这些示例的颤振库?我简直不敢相信他们在他们的文档中列出了这些示例方法,引用了其他未显示的与示例不可或缺的函数……没有它们,这些示例将毫无用处。所以也许我是一个初学者,我只是不知道图书馆在哪里......在某个地方有这些图书馆吗?一个大的 GitHub 示例文件?
  • @jbryanh 如果您想使用该库,您从文档页面复制的代码不是您应该使用的代码。它在那里被引用以向您展示该库提供给您使用的函数的内部工作原理。我不知道有哪个地方引用了您可以使用的每个示例。您只需要寻找自己可能需要的示例和代码。如果需要,您可以查看 github 上的所有核心 dart 代码。但我怀疑你是否愿意,如果你还是一个新手颤振/飞镖程序员。 github.com/dart-lang/sdk/tree/master/sdk/lib/core
【解决方案2】:

我确实找到了完整的代码示例here。

它没有使用名称_parseFormat,而只是使用RegExp?并且有 _withValue 和 _brokenDownDateToValue 声明。

在我看来,没有正确的方法来解码他们的示例。这个例子是不够的。字典不应使用在字典中其他地方找不到的词来创建定义。

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 2013-11-10
    • 2011-12-24
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2011-06-22
    • 2012-09-06
    相关资源
    最近更新 更多