Flutter中DateTime变量无法做空值检查及初始化问题求助
问题解决指南
核心问题根源
你遇到的所有问题都和Dart空安全机制直接相关:
- 普通
DateTime属于非可空类型,编译器强制要求必须初始化且永远不能为null,所以_selectedDate == null会被判定为无效条件(永远不成立)。 - 你说加
?设置可空没生效,大概率是只修改了变量声明,没同步调整初始化和后续使用逻辑。
分步解决方案
1. 正确声明可空日期变量
把_selectedDate改为可空类型DateTime?,并初始化为null(匹配你默认显示"No Date Chosen!"的需求):
DateTime? _selectedDate; // 初始为null代表未选择日期
2. 修复空检查与变量使用逻辑
变量变为可空后,空检查_selectedDate == null会正常生效,同时使用变量时要处理空情况:
- 在
_submitData中的判断逻辑:
if (enteredTitle.isEmpty || enteredOutput <= 0 || _selectedDate == null) { return; }
- 在UI显示的三元表达式中,用
!断言变量非空(因为已经通过null判断确保了安全):
Text(_selectedDate == null ? 'No Date Chosen !' : DateFormat.yMd().format(_selectedDate!)),
3. 修正日期选择器的赋值错误
你当前_presentDatePicker里的赋值方向完全写反了,应该把选择的日期赋值给_selectedDate:
setState(() { _selectedDate = pickedDate; // 正确更新选中日期 });
4. 按钮文字修正
日期选择按钮当前显示"Add Transaction",改成你需求中的"CHOOSE DATE":
TextButton( onPressed: _presentDatePicker, child: const Text("CHOOSE DATE"), ),
完整修正后的代码
import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; class NewTransaction extends StatefulWidget { final Function addTx; const NewTransaction(this.addTx, {super.key}); @override State<NewTransaction> createState() => _NewTransactionState(); } class _NewTransactionState extends State<NewTransaction> { final _titleController = TextEditingController(); final _amountController = TextEditingController(); // 改为可空类型并初始化为null DateTime? _selectedDate; void _submitData() { if (_amountController.text.isEmpty) { return; } final enteredTitle = _titleController.text; final enteredOutput = double.parse(_amountController.text); // 空检查现在正常生效 if (enteredTitle.isEmpty || enteredOutput <= 0 || _selectedDate == null) { return; } widget.addTx(enteredTitle, enteredOutput); Navigator.of(context).pop(); } void _presentDatePicker() { showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime(2019), lastDate: DateTime.now()) .then((pickedDate) { if (pickedDate == null) { return; } setState(() { // 修正赋值方向 _selectedDate = pickedDate; }); }); } @override Widget build(BuildContext context) { return Card( child: Container( padding: const EdgeInsets.all(10), child: Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ TextField( decoration: const InputDecoration(labelText: 'Title'), controller: _titleController, onSubmitted: (_) => _submitData(), ), TextField( decoration: const InputDecoration(labelText: 'Amount'), controller: _amountController, keyboardType: TextInputType.number, onSubmitted: (_) => _submitData(), ), Container( height: 70, child: Row( children: [ Text(_selectedDate == null ? 'No Date Chosen !' : DateFormat.yMd().format(_selectedDate!)), const SizedBox(width: 25.0), TextButton( onPressed: _presentDatePicker, child: const Text("CHOOSE DATE"), ), ], ), ), ElevatedButton( onPressed: _submitData, child: const Text("Add Transaction"), ) ], ), )); } }
内容的提问来源于stack exchange,提问作者Pullkit Acharya
相关产品推荐
相关产品推荐

