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
相关产品推荐
相关产品推荐

