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实例时,都会不断调用自身构造函数,直到调用栈被撑爆,触发栈溢出错误。
同时还有两处小问题:
- 构造函数内重复创建
Dio dio = Dio();,覆盖了传入的dio实例,属于冗余操作 - 引用的
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/"); }
额外优化建议
- 将
BASE_URL抽取为全局常量,避免多处重复定义 - 登录方法的参数名遵循Dart小驼峰命名规范(如
email、appPassword,替代Email、AppPassword) - 处理响应时,建议后端返回布尔类型的
Success字段,避免字符串比较的潜在问题
内容的提问来源于stack exchange,提问作者Diti app
相关产品推荐
相关产品推荐

