Flutter Future返回Instance of Future<String>而非PHP数据怎么办
问题原因
你看到返回Instance of Future<String>的核心原因是:所有被async关键字标记的函数,返回值始终是Future类型。你直接在Text组件里调用displayLg_name().toString()时,没有等待异步网络请求完成,拿到的是未执行完成的Future对象本身,而非请求返回的实际业务数据。
修复步骤
1. 调整Flutter异步渲染逻辑
Flutter 中渲染异步获取的数据不能直接在build方法里调用async函数,需要使用FutureBuilder组件监听异步任务状态,在数据返回后自动刷新UI。
首先补全并规范你的网络请求方法,明确返回值类型、增加异常处理:
Future<String> displayLg_name() async { try { var url = Uri.http( "192.168.68.216", '/ump_attendance_2/username.php', {'q': '{http}'}); var response = await http.post( url, body: {"lg_username": username.lg_username}, ); // 先判断HTTP请求状态码是否正常 if (response.statusCode == 200 && response.body.isNotEmpty) { return json.decode(response.body) as String; } return "数据加载失败"; } catch (e) { return "请求异常:${e.toString()}"; } }
然后替换原来Container中直接调用异步方法的代码,用FutureBuilder做状态判断:
Container( alignment: Alignment.centerLeft, child: FutureBuilder<String>( // 传入提前初始化好的Future实例 future: _lgNameFuture, builder: (context, snapshot) { // 加载中状态展示进度条 if (snapshot.connectionState == ConnectionState.waiting) { return const SizedBox( width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2), ); } // 请求异常展示错误提示 if (snapshot.hasError) { return const Text("加载错误"); } // 数据正常返回后渲染文本 return Text( snapshot.data ?? "", style: TextStyle( color: Colors.black54, fontFamily: "Ubuntu", fontWeight: FontWeight.bold, fontSize: scrwidth / 18, ), ); }, ), ),
优化提示:不要直接在FutureBuilder的future参数中调用
displayLg_name(),否则每次UI重绘都会重新发起网络请求。如果是StatefulWidget,建议在initState生命周期中提前初始化Future实例:late Future<String> _lgNameFuture; @override void initState() { super.initState(); _lgNameFuture = displayLg_name(); }
2. 修复PHP后端的隐患
你当前的PHP代码存在两个会导致异常的问题:
- 直接拼接前端传入参数到SQL语句,存在严重SQL注入风险
- 循环中多次输出JSON字符串会导致前端JSON解析失败,需要把结果汇总后一次性输出
修正后的PHP代码参考:
<?php include ("config.php"); session_start(); if (!isset($_REQUEST['lg_username'])) { echo json_encode("参数缺失"); exit; } $lg_username = $_REQUEST['lg_username']; // 改用预处理语句防范SQL注入 $stmt = mysqli_prepare($conn, "SELECT lg_name FROM hr_login WHERE lg_username = ?"); mysqli_stmt_bind_param($stmt, "s", $lg_username); mysqli_stmt_execute($stmt); $res = mysqli_stmt_get_result($stmt); $nameList = []; if (mysqli_num_rows($res) > 0){ while($row = mysqli_fetch_assoc($res)){ $nameList[] = $row['lg_name']; } } // 单条查询直接返回第一个结果即可 echo json_encode(!empty($nameList) ? $nameList[0] : "未找到对应用户"); mysqli_stmt_close($stmt); mysqli_close($conn); ?>
内容的提问来源于stack exchange,提问作者Jasmirulnaim
相关产品推荐
相关产品推荐

