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
相关产品推荐
相关产品推荐

