Flutter中Future方法内调用另一个Future方法无响应问题
问题排查与解决
核心问题分析
从代码来看,fetchStoryData没按预期执行,大概率是这两个原因:
1. recentStory为null时的参数异常
当((df.data() as Map)[story]) == null时,recentStory默认是null,此时调用fetchStoryData(recentStory, story)会把null传给storytList参数。fetchStoryData里的for (var fieldName in storytList)会直接触发空指针错误,但被try-catch吞了,你可能没看到错误日志,误以为函数没执行。
2. getRecentProgress调用方式错误
如果调用getRecentProgress时没加await,也没通过.then()处理Future,函数可能还没执行完就被中断,看起来像是fetchStoryData没跑。
修复方案
方案1:提前处理recentStory为空的场景
在调用fetchStoryData前先判断recentStory是否有效,避免传入无效参数:
Future<dynamic> getRecentProgress(story) async { DocumentSnapshot df = await user.doc(globals.user.uid).get(); var recentStory; if( ((df.data() as Map)[story]) == null) { print("_-_-_-_-_-_ NO RECENT STORY _-_-_-_-_-_-_"); // 直接返回空数据或抛出明确错误 return {}; } else { recentStory = ((df.data()) as Map)[story]; print("_-_-_-_-_-_ RECENT STORY _-_-_-_-_-_-_\n$recentStory"); } var storyData = await fetchStoryData(recentStory, story); print("_-_-_-_-_-_ FETCH STORY DATA _-_-_-_-_-_\n$storyData"); return storyData; }
方案2:在fetchStoryData内部增加空校验
给storytList加null判断,避免循环报错:
Future<Map<String, dynamic>> fetchStoryData(List<dynamic>? storytList, story) async { print("_-_-_-_-_-_ FUNCTION CALL _-_-_-_-_-_"); Map<String, dynamic> dataMap = {}; try { // 先判断参数是否有效 if (storytList == null || storytList.isEmpty) { print("_-_-_-_-_-_ storytList is null or empty _-_-_-_-_-_"); return dataMap; } DocumentSnapshot snapshot = await stories.doc(story).get(); if (snapshot.exists) { for (var fieldName in storytList) { dataMap[fieldName] = (snapshot.data() as Map)[fieldName]; print("_-_-_-_-_-_ DATA _-_-_-_-_-_$dataMap"); } } } catch(e, stackTrace) { print("Error fetching story data: $e"); // 打印错误栈,方便定位问题 print("Stack trace: $stackTrace"); } return dataMap; }
方案3:确保正确调用getRecentProgress
调用这个异步方法时,必须用await或者.then()处理结果:
// 使用await调用 void someFunction() async { var progress = await getRecentProgress("your_story_id"); // 处理返回的progress数据 } // 或者用then链式调用 getRecentProgress("your_story_id").then((progress) { // 处理返回的progress数据 });
调试小技巧
- 在
fetchStoryData的catch块里打印完整错误栈,能更精准定位问题 - 检查
globals.user.uid是否有效,确保user.doc(globals.user.uid).get()能正常返回数据
内容的提问来源于stack exchange,提问作者Dhanrajsinh Parmar
相关产品推荐
相关产品推荐

