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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:02:50