Flutter桌面端从PhpMyAdmin拉取数据无法渲染到ListView求助
问题根源
- 异步请求完成后未调用
setState通知Flutter刷新UI:你给data变量赋值的操作不会主动触发build方法重执行,ListView始终用初始的空数组渲染,所以表现为空白 - 第二版代码存在逻辑遗漏:你将
fetchData改为返回List的Future方法,但initState中调用时没有接收返回值赋值给全局data变量,请求到的数据根本没有被用到 - 第二版代码存在冗余操作:同一个响应结果你调用了两次
json.decode,属于无意义的重复运算
修复代码
直接修改_WarehousePageState部分即可,不需要新增Model类:
class _WarehousePageState extends State<WarehousePage> { List data = []; bool isLoading = true; String? errorMsg; @override void initState() { fetchData(); super.initState(); } void fetchData() async { try { var url = Uri.parse('https://你的实际接口地址/getdata.php'); var response = await http.get(url).timeout(const Duration(seconds: 20)); if (response.statusCode == 200) { var jsonResponse = json.decode(response.body); if (jsonResponse != null && jsonResponse is List) { setState(() { data = jsonResponse; isLoading = false; }); return; } } // 非200状态码或返回数据不是列表的情况 setState(() { errorMsg = "接口返回数据格式异常"; isLoading = false; }); } on SocketException catch (e) { setState(() { errorMsg = "网络连接失败:${e.toString()}"; isLoading = false; }); } catch (e) { setState(() { errorMsg = "未知错误:${e.toString()}"; isLoading = false; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: _buildBody(), ); } Widget _buildBody() { if (isLoading) { return const Center(child: CircularProgressIndicator()); } if (errorMsg != null) { return Center(child: Text(errorMsg!)); } if (data.isEmpty) { return const Center(child: Text("暂无数据")); } return ListView.builder( itemCount: data.length, itemBuilder: (BuildContext context, int index) => ListTile( title: Text(data[index]['productName'] ?? "无商品名称"), ), ); } }
额外注意事项
- 请确认接口返回的字段名确实为
productName,注意大小写是否匹配,字段名拼写错误也会导致渲染异常 - 如果你开发的是Windows/macOS桌面端,需要提前配置网络权限,否则会出现请求被拦截的问题
内容的提问来源于stack exchange,提问作者user16893569
相关产品推荐
相关产品推荐

