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

Flutter连接MySQL时,如何替换格式异常为自定义无数据提示?

解决Flutter中查询MySQL失败时的FormatException并显示自定义提示

这个问题的核心在于:当PHP查询失败时,返回的内容不是合法的JSON格式(可能是错误提示文本),导致Flutter里的json.decode()抛出FormatException,最终被FutureBuilder捕获并显示默认的错误信息。我们可以从三个层面来处理:

1. 在Flutter网络请求层捕获异常,避免传递到UI层

修改你的_getUsers()方法,用try-catch包裹JSON解码逻辑,同时处理网络请求和服务器状态码异常,确保无论什么情况都返回可预期的结果(比如空列表):

_getUsers() async {
  try {
    final response = await http.post(
      Uri.parse("http://10.0.2.2/Flutter/count.php"),
      body: {"dat": count},
    );

    // 先检查服务器响应是否正常(状态码200)
    if (response.statusCode == 200) {
      try {
        // 尝试解码JSON
        return json.decode(response.body);
      } catch (e) {
        // 解码失败(比如返回错误文本),返回空列表
        return [];
      }
    } else {
      // 服务器返回错误状态码,返回空列表
      return [];
    }
  } catch (e) {
    // 网络请求失败(如断网),返回空列表
    return [];
  }
}

2. 在FutureBuilder中根据数据状态显示自定义提示

修改builder逻辑,先判断返回的数据是否为空,再决定显示自定义提示还是列表:

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backgroundColor: Colors.teal,
    ),
    body: Container(
      color: Colors.teal,
      child: FutureBuilder(
        future: _getUsers(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          }

          // 如果数据为空或null,显示自定义提示
          if (snapshot.data == null || snapshot.data.isEmpty) {
            return const Center(
              child: Text(
                '未找到数据',
                style: TextStyle(color: Colors.white, fontSize: 20)
              ),
            );
          }

          // 数据正常时渲染列表
          return Padding(
            padding: const EdgeInsets.fromLTRB(56.0, 8.0, 56.0, 8.0),
            child: ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index) {
                // 额外保险:避免字段不存在导致的异常
                final branch = snapshot.data[index]["branch"] ?? '未知分支';
                final countVal = snapshot.data[index]["count(`branch`)"]?.toString() ?? '0';
                
                return ListTile(
                  leading: Text(
                    branch,
                    style: const TextStyle(color: Colors.white, fontSize: 25.0),
                  ),
                  trailing: Text(
                    countVal,
                    style: const TextStyle(color: Colors.white, fontSize: 25.0),
                  ),
                );
              },
            ),
          );
        },
      ),
    ),
  );
}

3. 优化PHP端(可选但推荐)

从根源上避免非JSON返回:在PHP查询失败时,返回合法的空JSON数组,而不是错误提示文本。比如:

<?php
// 假设你的数据库连接和查询逻辑
$conn = mysqli_connect("localhost", "user", "pass", "db");
$sql = "SELECT branch, count(`branch`) FROM your_table WHERE ...";
$result = mysqli_query($conn, $sql);

if ($result) {
  // 查询成功,返回数据数组
  $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
  echo json_encode($data);
} else {
  // 查询失败,返回空数组
  echo json_encode([]);
}

mysqli_close($conn);
?>

这样即使PHP查询出错,返回的也是[],Flutter端解码不会抛出异常,直接进入空数据的提示逻辑。

内容的提问来源于stack exchange,提问作者raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:17:26