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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:40:49