Flutter中DropdownButton2组件Release模式搜索功能失效求助
问题原因
Debug模式下,Text组件的toString()会返回完整文本内容,但Release模式下Flutter会开启代码优化(Tree Shaking),Text的toString()会被简化为仅显示组件类型的格式(无法提取实际文本值)。你原有的搜索逻辑依赖item.child.toString()拆分内容,这就导致Release模式下无法获取正确的搜索字段,最终搜索完全失效。
解决方案
不要通过DropdownMenuItem的child组件提取搜索内容,而是直接使用原始数据源字段,或者提前存储搜索信息,彻底避开对Widget toString方法的依赖。
方案1:基于原始数据源匹配(推荐)
利用DropdownMenuItem的value字段反向关联原始数据,直接用rawmatcode和rawmatname做搜索匹配:
修改dropdownSearchData中的searchMatchFn:
dropdownSearchData: DropdownSearchData( // 保留原有其他配置 searchMatchFn: (item, searchValue) { final lowerCaseValue = searchValue.toLowerCase(); // 从value中拆分出rawmatcode final rawmatCode = item.value!.split('-')[0]; // 找到对应的原始数据项 final targetPart = myPartList.firstWhere( (part) => part.rawmatcode == rawmatCode, orElse: () => MyParts(), // 根据你的类定义调整异常处理 ); // 保持和生成MenuItem时一致的名称截断逻辑 String displayName = targetPart.rawmatname?.length > 10 ? "${targetPart.rawmatname!.substring(0, 10)}..." : targetPart.rawmatname ?? ""; // 匹配编号和名称 return rawmatCode.toLowerCase().contains(lowerCaseValue) || displayName.toLowerCase().contains(lowerCaseValue); }, ),
方案2:通过Key预存搜索信息
生成DropdownMenuItem时,用ValueKey存储需要搜索的字段,后续直接读取:
第一步:修改DropdownMenuItem生成代码
List<DropdownMenuItem<String>> dropdownPartNumbers = myPartList.map<DropdownMenuItem<String>>((item) { String rawmatName = item.rawmatname!.length > 10 ? "${item.rawmatname!.substring(0, 10)}..." : item.rawmatname!; return DropdownMenuItem<String>( value: "${item.rawmatcode}-${item.serialNocapture}", // 用Key存储搜索所需的编号和名称 key: ValueKey({ "code": item.rawmatcode!, "name": rawmatName, }), child: Text("${item.rawmatcode!} ($rawmatName)"), ); }).toList();
第二步:修改searchMatchFn逻辑
dropdownSearchData: DropdownSearchData( // 保留原有其他配置 searchMatchFn: (item, searchValue) { final lowerCaseValue = searchValue.toLowerCase(); // 从Key中取出预存的搜索字段 final searchData = (item.key as ValueKey<Map<String, String>>).value; final rawmatCode = searchData["code"]!; final rawmatName = searchData["name"]!; // 匹配编号和名称 return rawmatCode.toLowerCase().contains(lowerCaseValue) || rawmatName.toLowerCase().contains(lowerCaseValue); }, ),
注意事项
- 方案1需确保
myPartList在searchMatchFn作用域内可访问; - 若
rawmatcode不唯一,方案1的firstWhere需结合serialNocapture做更精确匹配; - 两种方案均不受Release模式优化影响,能稳定实现数字和文本的双维度搜索。
内容的提问来源于stack exchange,提问作者Ayan
相关产品推荐
相关产品推荐

