Flutter页面加载时ListView为空,输入筛选关键词后才显示数据求助
问题分析与解决方案
核心问题原因
页面初始化时_filteredHealthfacilities始终为空,因为:
- 初始状态下
_filteredHealthfacilities被定义为空列表 - 调用
_fetchHealthFacilities获取数据后,仅更新了_allealthfacilities,但未同步更新_filteredHealthfacilities - 只有当
TextField内容变化触发_runFilter时,_filteredHealthfacilities才会被赋值
修复步骤
1. 数据获取后同步更新筛选列表
在_fetchHealthFacilities方法的setState块中,添加对_filteredHealthfacilities的赋值,确保初始加载时就填充全部数据:
Future<void> _fetchHealthFacilities() async { setState(() { isLoading = true; // 新增:开始加载时标记状态 }); final db = await DatabaseHelper.instance.database; EasyLoading.show(status: 'Loading...'); final List<Map<String, dynamic>> results = await db.rawQuery( "SELECT * FROM ${DatabaseHelper.dbTableHealthfacilities} ORDER BY officename ASC"); print(results); setState(() { _allealthfacilities = results.map((map) => Healthfacilities.fromJson(map)).toList(); _filteredHealthfacilities = _allealthfacilities; // 新增:同步筛选列表 isLoading = false; // 新增:加载完成后标记状态 }); EasyLoading.dismiss(); }
2. 完善加载状态控制
原代码中isLoading变量未被正确更新,导致加载指示器无法正常显示。上述代码中已添加isLoading的状态切换,确保数据加载过程中显示进度提示。
完整修正后的关键代码片段
class _HealthFacilitiesListScreenState extends State<HealthFacilitiesListScreen> { bool isLoading = false; List<Healthfacilities> _allealthfacilities = []; List<Healthfacilities> _filteredHealthfacilities = []; Future<void> _fetchHealthFacilities() async { setState(() { isLoading = true; }); final db = await DatabaseHelper.instance.database; EasyLoading.show(status: 'Loading...'); final List<Map<String, dynamic>> results = await db.rawQuery( "SELECT * FROM ${DatabaseHelper.dbTableHealthfacilities} ORDER BY officename ASC"); print(results); setState(() { _allealthfacilities = results.map((map) => Healthfacilities.fromJson(map)).toList(); _filteredHealthfacilities = _allealthfacilities; isLoading = false; }); EasyLoading.dismiss(); } // ... 其余代码保持不变 }
额外说明
- 无需在
initState中手动赋值_filteredHealthfacilities,因为数据获取是异步操作,此时_allealthfacilities仍为空 _runFilter方法逻辑正确,输入空值时会自动重置为全部数据,无需修改
内容的提问来源于stack exchange,提问作者Aamir Khan
相关产品推荐
相关产品推荐

