Flutter中DateTime传入Firestore后变为null的问题求助
问题解决:datasaida字段提交Firestore时为null
核心错误点
- 日期输入框的
onChanged回调错误调用了getSaidaName()方法,而非对应的getSaidaDate(),导致datasaida变量从未被赋值,始终为null。 - 通过
showDatePicker设置输入框文本时,onChanged不会自动触发,这也会导致datasaida无法同步更新。
修复方案
方案1:修正回调并手动同步变量
修改日期输入框的代码,把onChanged里的方法改成getSaidaDate,同时在选择日期后手动更新变量:
TextFormField( controller: saidadatecontroller, onChanged: (datasaida){ getSaidaDate(datasaida); // 替换为正确的方法 }, autofocus: true, decoration: InputDecoration( // 原有装饰代码保持不变 ), onTap: () async { DateTime? pickeddate = await showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime(2022), lastDate: DateTime(2036)); if (pickeddate != null) { String formattedDate = DateFormat('dd-MM-yyyy').format(pickeddate); saidadatecontroller.text = formattedDate; getSaidaDate(formattedDate); // 手动更新datasaida变量 } }, )
方案2:直接从控制器取值(更简洁可靠)
可以直接抛弃中间变量,在提交数据时读取控制器的文本,避免赋值错误:
createData(){ DocumentReference ds=FirebaseFirestore.instance.collection('addsaidas').doc(saidanamecontroller.text); Map<String,dynamic> tasks={ "valorsaida": saidavaluecontroller.text, "nomesaida": saidanamecontroller.text, "datasaida": saidadatecontroller.text, // 直接从控制器拿值 "tipocategoria": categVal, }; ds.set(tasks).whenComplete((){ print("task updated"); }); }
用这种方式的话,还可以删掉valorsaida、nomesaida、datasaida这几个成员变量,以及对应的getSaidaValue、getSaidaName、getSaidaDate方法,大幅简化代码。
内容的提问来源于stack exchange,提问作者duda
相关产品推荐
相关产品推荐

