Flutter开发报错:Future<List<Appointment>>不是List<Appointment>子类型如何解决
问题根因
报错和你判断的一致,核心是Future<List<Appointment>>类型无法直接强转为List<Appointment>类型:你在getData()中调用异步方法foo()时没有加await,直接将未执行完成的Future对象当做List做类型转换,必然触发类型不匹配错误。
你之前尝试修改
foo()返回类型的操作无法解决问题,因为foo()内部有await dio.get的异步逻辑,本身就必须定义为async方法、返回Future类型,问题完全出在调用侧的处理逻辑。
修复方案
仅需修改getData()方法中调用异步方法的逻辑,加上await关键字等待异步执行完成拿到实际返回的List结果即可:
Stream<DataSource> getData() async* { await Future.delayed(const Duration(seconds: 1)); //Mock delay // 加await等待foo()异步执行完成,拿到List<Appointment>结果 List<Appointment> appointments = await foo(); // 如果bar()同样是返回Future的异步方法,也需要加await List<CalendarResource> resources = await bar(); DataSource data = DataSource(appointments, resources); print("Fetched Data"); yield data; }
可选优化建议
- 当前实现每次执行前固定等待1秒,若接口请求耗时不稳定会导致轮询间隔漂移,若要实现严格的固定间隔轮询,可以改用
Stream.periodic构造:
Stream<DataSource> getData() { return Stream.periodic(const Duration(seconds: 1), (_) async { List<Appointment> appointments = await foo(); List<CalendarResource> resources = await bar(); return DataSource(appointments, resources); }).asyncMap((event) async => await event); }
- 注意控制接口请求频率,避免高频请求触发服务端限流规则。
- 如果你使用
StreamBuilder绑定数据流,无需单独在initState中调用listen,直接将getData()传入StreamBuilder的stream参数即可直接监听数据流更新UI。
内容的提问来源于stack exchange,提问作者Jwan Haj S.
相关产品推荐
相关产品推荐

