Flutter MultiSelect使用中Firestore查询结果转List类型不匹配问题咨询
问题原因
- 类型不匹配赋值:initState方法中直接将动态类型列表
_allResults(存储Firebase返回的QueryDocumentSnapshot对象)赋值给声明为List<Contexts>类型的_selectedContext,两者类型不兼容触发类型错误。 - Firestore查询结果未做模型转换:从Firestore查询拿到的
data.docs是原始文档快照列表,没有通过Contexts.fromSnapshot转换为自定义的Contexts模型对象,就直接存入了_allResults,后续操作自然类型不匹配。 - 多选组件的选项列表未绑定动态数据:当前
_context是静态硬编码的列表,生成多选选项_itemsContext时也用的是静态数据,Firebase查询到的动态数据没有同步更新到_context和_itemsContext中,导致后台数据不会出现在多选选项里。
解决方案
按以下步骤修改代码即可解决:
- 调整变量声明,统一类型规范
替换原有变量声明部分:
// 统一存储Contexts类型对象 List<Contexts> _allResults = []; List<Contexts> _resultsList = []; // 改为动态变量,后续会用Firebase数据覆盖 List<Contexts> _context = []; // 用late声明,等_context赋值后再初始化 late List<MultiSelectItem<Contexts>> _itemsContext;
- 修正initState逻辑,删除错误赋值
去掉initState里的类型不匹配赋值语句:
@override void initState() { super.initState(); _searchController.addListener(_onSearchChanged); }
- 修改Firestore查询方法,完成模型转换
将查询到的文档快照批量转换为Contexts对象,同步更新多选选项:
getUsersListOfTasksStreamSnapshots() async { var data = await FirebaseFirestore.instance .collection('Users') .doc(FirebaseAuth.instance.currentUser.uid) .collection('contexts') .get(); // 把文档快照全部转换为Contexts对象 List<Contexts> convertedList = data.docs.map((doc) => Contexts.fromSnapshot(doc)).toList(); setState(() { _allResults = convertedList; _context = convertedList; // 动态生成多选组件的选项列表 _itemsContext = _context.map((context) => MultiSelectItem<Contexts>(context, context.contextName)).toList(); }); searchResultsList(); return 'complete'; }
- 调整搜索方法适配类型
修改搜索逻辑适配统一的Contexts类型:
searchResultsList() { List<Contexts> showResults = []; if(_searchController.text != "") { for(var contextObj in _allResults){ var title = contextObj.contextName.toLowerCase(); if(title.contains(_searchController.text.toLowerCase())) { showResults.add(contextObj); } } } else { showResults = List.from(_allResults); } setState(() { _resultsList = showResults; }); }
内容的提问来源于stack exchange,提问作者Laurent Thomas
相关产品推荐
相关产品推荐

