You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中FormatException求助:无效日期格式致应用崩溃

问题:API返回无效日期时应用崩溃,需显示空值而非崩溃

现象

  • API返回无效格式日期(如NaNNaNNa)时,应用触发FormatException崩溃
  • 尝试通过try{}catch(e)捕获异常,但崩溃仍发生

崩溃栈信息

Fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: FormatException: Invalid date format
8 Apr 20. Error thrown while handling a gesture.
       at DateTime.parse(dart:core)
       at MyTravellersCtrl.loadTravellerIntoForm(my_travellers_ctrl.dart:298)
       at _MyTravellersView.build.<fn>.<fn>(my_travellers_page.dart:168)
       at _TravellersListView.build.<fn>.<fn>.<fn>(my_travellers_page.dart:752)
       at _InkResponseState.handleTap(ink_well.dart:1154)
       at GestureRecognizer.invokeCallback(recognizer.dart:275)
       at TapGestureRecognizer.handleTapUp(tap.dart:654)
       at BaseTapGestureRecognizer._checkUp(tap.dart:311)
       at BaseTapGestureRecognizer.acceptGesture(tap.dart:281)
       at GestureArenaManager.sweep(arena.dart:167)
       at GestureBinding.handleEvent(binding.dart:492)
       at GestureBinding.dispatchEvent(binding.dart:468)
       at RendererBinding.dispatchEvent(binding.dart:333)
       at GestureBinding._handlePointerEventImmediately(binding.dart:413)
       at GestureBinding.handlePointerEvent(binding.dart:376)
       at GestureBinding._flushPointerEventQueue(binding.dart:323)
       at GestureBinding._handlePointerDataPacket(binding.dart:292)

崩溃根源

loadTravellerIntoForm方法中使用了DateTime.parse,该方法在日期格式无效时会直接抛出FormatException;而DateTime.tryParse在格式无效时返回null,不会触发崩溃。此前formattedDate方法已正确使用tryParse处理无效日期,但loadTravellerIntoForm未同步修改。

修复方案

将loadTravellerIntoForm中的DateTime.parse替换为DateTime.tryParse,并处理null情况,确保无效日期时返回空字符串。

修复后代码

void loadTravellerIntoForm(TravellerProfile? traveller) {
  String formattedPassportExpiry = '';

  if (traveller?.passportExpiry != null &&
      traveller?.passportExpiry?.isNotEmpty == true) {
    final dateStr = traveller?.passportExpiry?.substring(0, 8) ?? '';
    final dateTime = DateTime.tryParse(dateStr);
    if (dateTime != null) {
      formattedPassportExpiry = DateFormat('dd MMM yyyy').format(dateTime);
    }
  }
  
  passportExpiryDateTextCtrl.text = formattedPassportExpiry;
  // ... 其他代码
}

优化建议:复用已有格式化逻辑

现有formattedDate方法已实现无效日期处理,可复用该方法统一日期格式化逻辑,避免重复代码:

void loadTravellerIntoForm(TravellerProfile? traveller) {
  String formattedPassportExpiry = '';
  // 复用formattedDate处理原始日期
  String baseFormatted = formattedDate(traveller?.passportExpiry ?? '');
  if (baseFormatted.isNotEmpty) {
    final dateTime = DateTime.tryParse(baseFormatted);
    if (dateTime != null) {
      formattedPassportExpiry = DateFormat('dd MMM yyyy').format(dateTime);
    }
  }
  
  passportExpiryDateTextCtrl.text = formattedPassportExpiry;
  // ... 其他代码
}

内容的提问来源于stack exchange,提问作者grizzzzzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:25:55