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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:42:23