Flutter中'duplicateItems'未定义,修改后仍报错,寻求解决
解决“未定义名称'duplicateItems'”及搜索过滤问题
核心问题分析
- 未定义
duplicateItems:代码直接使用了duplicateItems变量,但从未声明过它——这是报错的直接原因。 - 改名后仍报错的隐藏问题:
problemlist是problemModel对象列表,你试图调用item.toLowerCase(),但对象本身没有这个方法,必须针对对象的具体属性(比如标题、描述等)做字符串处理。 - 额外性能隐患:
initState里每1秒调用一次接口,会导致频繁网络请求和状态刷新,严重影响性能。
完整修复方案
1. 声明原始数据副本
在状态类里新增变量保存接口返回的原始数据,避免过滤时覆盖原始列表:
class _ViewProblemState extends State<ViewProblem> { List<ProblemModel> problemlist = []; // 新增:保存原始数据的副本 List<ProblemModel> _originalProblemList = []; StreamController _streamController = StreamController(); Timer? _timer; // 新增:管理定时器 // ... }
2. 修改接口请求逻辑
更新getAllProblem方法,同时更新原始列表和显示列表:
Future getAllProblem() async { _originalProblemList = await Problemcontrollers().getProblem(); setState(() { // 重置显示列表为原始数据 problemlist = List.from(_originalProblemList); }); _streamController.sink.add(_originalProblemList); }
3. 修复搜索过滤逻辑
针对problemModel的具体属性(比如title,请根据实际模型字段修改)进行过滤:
void _filterSearch(String query) { setState(() { if (query.trim().isEmpty) { // 搜索为空时重置为原始列表 problemlist = List.from(_originalProblemList); } else { problemlist = _originalProblemList .where((item) => // 替换为你实际需要过滤的字段,比如item.title item.title.toLowerCase().contains(query.toLowerCase())) .toList(); } }); }
4. 优化定时器与资源释放
调整定时器间隔(建议拉长到30秒以上),并在页面销毁时释放资源:
@override void initState() { super.initState(); // 初始化时先请求一次数据 getAllProblem(); // 设置定时刷新,避免过于频繁 _timer = Timer.periodic(Duration(seconds: 30), (timer) { getAllProblem(); }); } @override void dispose() { // 页面销毁时取消定时器 _timer?.cancel(); // 关闭流控制器,避免内存泄漏 _streamController.close(); super.dispose(); }
5. 代码规范修正(可选但推荐)
遵循Dart代码规范,类名首字母大写、使用驼峰命名:
// 修正类名 class ViewProblem extends StatefulWidget { @override State<ViewProblem> createState() => _ViewProblemState(); } // 修正模型类名 class ProblemModel { // 你的模型字段 String title; // ... }
内容的提问来源于stack exchange,提问作者gamedev dover
相关产品推荐
相关产品推荐

