Flutter中FutureBuilder的snapshot.hasError始终为false问题求助
问题排查与解决方案
1. 优先排查父类BaseLogic的异常拦截逻辑
你的Auth类继承自BaseLogic,大概率是父类对异步方法做了统一异常捕获封装,吃掉了你手动抛出的Exception,导致返回的Future始终是完成状态而非异常状态。你可以临时把signup方法改成独立的、不继承任何类的测试方法,直接抛出异常,看是否能触发snapshot.hasError。
2. 检查_signupRequested是否被额外添加了catchError
如果你在其他地方对_signupRequested这个Future调用过catchError方法,会直接将异常状态转换为普通完成状态,异常不会传递到FutureBuilder中。确认你给_signupRequested赋值的代码只有按钮点击事件里的这一处,没有额外的异常捕获处理。
3. 调整判断逻辑增加状态打印
你可以先在FutureBuilder的builder回调中增加打印,确认Future的实际状态:
builder: (context, snapshot) { debugPrint("连接状态: ${snapshot.connectionState}"); debugPrint("是否有数据: ${snapshot.hasData}"); debugPrint("是否有错误: ${snapshot.hasError}"); debugPrint("错误内容: ${snapshot.error}"); // 原有逻辑 }
如果打印结果显示snapshot.error有值但snapshot.hasError为false,大概率是你的Flutter SDK版本存在罕见bug,你可以直接用snapshot.error != null替代snapshot.hasError判断即可。
4. 临时最小示例验证
如果以上排查都没有问题,你可以写一个最小可运行示例复现,排除其他业务代码的干扰:
class TestPage extends StatefulWidget { const TestPage({super.key}); @override State<TestPage> createState() => _TestPageState(); } class _TestPageState extends State<TestPage> { Future<bool>? _testFuture; @override Widget build(BuildContext context) { return Scaffold( body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: () { setState(() { _testFuture = Future.error("测试异常"); }); }, child: const Text("触发异常"), ), FutureBuilder<bool>( future: _testFuture, builder: (context, snapshot) { if (snapshot.hasData) { return Text("拿到数据: ${snapshot.data}"); } else if (snapshot.hasError) { return Text("拿到错误: ${snapshot.error}"); } else if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } else { return const Text("请点击按钮"); } }, ) ], ), ); } }
如果这个最小示例运行正常,说明你现有项目中的其他业务代码(比如AuthRepo、BaseLogic的封装)拦截了异常。
内容的提问来源于stack exchange,提问作者Michele Roselli
相关产品推荐
相关产品推荐

