You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:27:01