不使用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
相关产品推荐
相关产品推荐

