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

dropdown_textfield取值异常:打印值非空,插入Firestore时却为空

问题:使用dropdown_textfield包时,选中值打印正常但存入Firestore为null

我在用dropdown_textfield包时遇到问题:从下拉菜单选择的值打印出来不为空,但插入Firestore数据库时却变成null。

下拉菜单代码:

Padding(
  padding: const EdgeInsets.symmetric(horizontal: 20),
  child: ClipRRect(
    borderRadius: BorderRadius.circular(10),
    child: DropDownTextField(
      controller: _cnt,
      clearOption: false,
      textFieldDecoration: InputDecoration(
        filled: true,
        fillColor: Colors.white,
        border: InputBorder.none,
        hintText: "Şehir seçiniz",
        hintStyle: GoogleFonts.inter(
          fontSize: 16,
          fontWeight: FontWeight.w300,
          color: Colors.white
        )
      ),
      validator: (value) {
        if (value==null) {
          return "Zorunlu alan";
        }else {
          return null;
        }
      },
      dropDownItemCount: 6,
      dropDownList: const [
        DropDownValueModel(name: 'İstanbul', value: 'İstanbul'),
        DropDownValueModel(name: 'Ankara', value: 'Ankara')
      ], 
      onChanged: (val){
        setState(() {
          selectedCity = val;
          print("$val");
        });
      },
    ),
  ),
)

上传Firestore代码:

Future<void> _insertSellerDetails() async {

    // Bilgiler eksiksiz ise verileri firestore a gönder
    if (_formKey.currentState!.validate()) {
      try {
        String userId = FirebaseAuth.instance.currentUser?.uid ?? "";
        if (userId.isNotEmpty) {
          List<String> imageUrls = await _uploadImagesToStorage();

          Map<String, dynamic> sellerDetails = {
            "sellerName": sellerName.text,
            "sellerLastName": sellerLastName.text,
            "sellerAge": sellerAge.text,
            "sellerHeight": sellerHeight.text,
            "sellerWeight": sellerWeight.text,
            "sellerDesc": sellerDesc.text,
            "city":selectedCity,
            "district":selectedDistrict,
            "imageUrls": imageUrls,
          };
          await FirebaseFirestore.instance
              .collection("Users")
              .doc(userId)
              .update({"sellerDetails": sellerDetails});
        }
      } catch (e) {
        log("error $e");
        // Show error message to the user
      }
    }
  }

我已确认插入前打印selectedCity不为空,但存入Firestore后显示为null。


问题原因

onChanged回调返回的val是DropDownValueModel类型的对象,并非直接的字符串。虽然打印时会显示对象的属性内容,但Firestore无法直接序列化这个自定义对象,最终导致存入后值为null。

解决方案

方案1:直接存储选中值的字符串

修改onChanged回调,将selectedCity赋值为val.value(即你定义的字符串值):

onChanged: (val){
  setState(() {
    selectedCity = val.value; // 提取字符串值
    print("$selectedCity");
  });
},

同时确保selectedCity的变量类型为String,避免类型不匹配问题。

方案2:存入时转换为字符串

如果需要保留selectedCity为DropDownValueModel对象,在构建Firestore数据时提取其value字段:

Map<String, dynamic> sellerDetails = {
  // ...其他字段
  "city": selectedCity.value, // 提取字符串值存入
  "district": selectedDistrict.value,
  // ...其他字段
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:07:25