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

