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

Flutter调用登录API出现maximum call stack size exceeded错误求助

问题排查:Flutter调用登录API出现栈溢出错误

问题描述

调用登录REST API时,持续收到maximum call stack size exceeded flutter(调用栈溢出)错误,相关代码如下:

登录方法代码

Future<void> login(String Email, String AppPassword)
async {
  try {
    const String BASE_URL="http://app.xxxxx.in/api/User/";
    Dio dio = Dio();
    Apis apis = Apis(dio,baseUrl: BASE_URL);
    final response = await apis.login(Email,AppPassword);
    if(response.Success == "true")
    {
      Navigator.push(context,MaterialPageRoute(builder: (context) => Home()));
    }
    // Handle successful login, e.g., navigate to another screen
  } catch (e) {
    // Handle login error, e.g., show error message to the user
    print('Login failed: $e');
  }
}

Apis类相关代码

factory Apis(Dio dio, {String? baseUrl}){
  Dio dio = Dio();
  return Apis(dio, baseUrl: BASE_URL);
}

@POST("/login")
@FormUrlEncoded()
Future<LoginResponse> login(@Field("Email") email,@Field("AppPassword") password);

问题原因

Apis的工厂构造函数存在无限递归调用:
在factory Apis(Dio dio, {String? baseUrl})方法里,最后一行又调用了Apis(dio, baseUrl: BASE_URL),这会导致每次创建Apis实例时,都会不断调用自身构造函数,直到调用栈被撑爆,触发栈溢出错误。

同时还有两处小问题:

  1. 构造函数内重复创建Dio dio = Dio();,覆盖了传入的dio实例,属于冗余操作
  2. 引用的BASE_URL未在当前作用域定义,会引发编译错误

修复方案

修改Apis的工厂构造函数,终止递归调用,正确初始化实例:

如果是基于Retrofit生成的Apis类,应返回自动生成的实现类(通常为_$Apis):

factory Apis(Dio dio, {String? baseUrl}){
  // 使用传入的dio实例,不再重复创建
  return _$Apis(dio, baseUrl: baseUrl ?? "http://app.xxxxx.in/api/User/");
}

如果是手动实现的Apis类,直接返回实例而非递归调用自身:

// 先定义普通构造函数
Apis(this.dio, {this.baseUrl});

factory Apis(Dio dio, {String? baseUrl}){
  return Apis(dio, baseUrl: baseUrl ?? "http://app.xxxxx.in/api/User/");
}

额外优化建议

  1. 将BASE_URL抽取为全局常量,避免多处重复定义
  2. 登录方法的参数名遵循Dart小驼峰命名规范(如email、appPassword,替代Email、AppPassword)
  3. 处理响应时,建议后端返回布尔类型的Success字段,避免字符串比较的潜在问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:42:14