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

不使用FutureBuilder获取Future值时报Instance of 'Future<void>'如何解决

问题原因

  • 异步函数getLoadStudent返回的是Future对象本身,你直接在build方法中调用时,异步逻辑还未执行完成,所以拿到的不是最终返回值,而是Future实例,渲染时就会显示Instance of 'Future<void>'
  • 你当前定义的getLoadStudent返回类型为Future<void>,没有把拿到的结果存储到可被UI访问的状态变量中,即使异步执行完成,UI也拿不到对应的值

解决方案

不需要使用FutureBuilder的话,你可以通过State成员变量存储异步结果,配合initState触发加载、setState更新UI实现需求,修改后的代码如下:

1. 调整main.dart的State逻辑

class _MyHomePageState extends State<MyHomePage> {
  // 存储异步加载得到的结果
  String? _countryResult;
  // 可选:标记加载状态,优化用户体验
  bool _isLoading = false;

  @override
  void initState() {
    super.initState();
    // 页面初始化时触发异步加载
    _fetchStudentData();
  }

  Future<void> _fetchStudentData() async {
    setState(() => _isLoading = true);
    try {
      // 等待异步方法执行完成拿到结果
      final String result = await loadStudent();
      // 调用setState更新状态,触发UI重绘
      setState(() => _countryResult = result);
    } catch (err) {
      // 可自行添加异常处理逻辑
      debugPrint('加载JSON失败:$err');
    } finally {
      setState(() => _isLoading = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 根据状态渲染对应内容
            _isLoading
                ? const CircularProgressIndicator()
                : Text(
                    _countryResult ?? '暂无数据',
                  ),
            Container(
                // child: projectWidget(),
            )
          ],
        ),
      ),
    );
  }
}

2. 可选优化:完善helperLoadJson.dart的类型声明

建议给loadStudent显式声明返回类型,避免类型推断异常:

// 显式声明返回类型为Future<String>
Future<String> loadStudent([int index]) async {
  String jsonString = await _loadAStudentAsset();
  final jsonResponse = json.decode(jsonString);
  QuotList quotList = QuotList.fromJson(jsonResponse);
  return quotList.quots[0].country;
}

注意事项

  • 不要在build方法中直接调用异步函数获取值,build方法会频繁触发,会导致重复执行异步逻辑、性能损耗
  • 异步逻辑执行完成后必须调用setState才能更新UI,把最新的状态值渲染到页面上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:24:03