Flutter类型不匹配:(Subtype)=>Future<String>非(Supertype)=>Future<Object>子类型
问题解决方法
这个错误的核心原因是你的State类没有正确关联父组件的泛型参数,导致widget被推断为NewStandardFutureBuilder<dynamic, dynamic>,类型不匹配引发强制转换失败。直接按以下步骤修改代码即可解决:
1. 修正State类的泛型约束
把_NewStandardFutureBuilderState继承的State<NewStandardFutureBuilder>改成State<NewStandardFutureBuilder<T, S>>,让State正确识别父组件的泛型类型:
class _NewStandardFutureBuilderState<T extends Object, S extends Service> extends State<NewStandardFutureBuilder<T, S>> { // 这里补充<T,S>泛型参数 late Future<T> future; @override void initState() { super.initState(); // 无需强制类型转换,widget.service已经是正确的S类型 future = widget.createFuture(widget.service); } Future<void> load() async { setState(() { // 同样去掉不必要的强制转换 future = widget.createFuture(widget.service); }); } @override Widget build(BuildContext context) { return FutureBuilder<T>( future: future, builder: (context, snapshot) { // 保留你原本的快照状态处理逻辑,示例如下: if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } else if (snapshot.hasError) { return Text('加载失败:${snapshot.error}'); } else if (snapshot.hasData) { return widget.builder(snapshot.data!); } else { return const Text('无数据'); } }, ); } }
2. 确保DataWidgetBuilder定义正确
如果还未定义该类型别名,补充以下代码:
typedef DataWidgetBuilder<T> = Widget Function(T data);
验证组件使用
你的调用代码无需修改,保持原写法即可正常运行:
return NewStandardFutureBuilder<String, AuthenticationService>( service: AuthenticationService(), createFuture: (service) => service.getUsername(), builder: (username) => Text('You are logged in as $username'), );
改动原理
原来的State类未绑定父组件的泛型参数,导致Dart无法识别widget的具体泛型类型,只能推断为动态类型,进而引发函数参数类型不匹配的错误。修正泛型约束后,State能准确获取父组件的<T,S>信息,widget.service和createFuture的类型完全匹配,不需要任何强制转换就能正常工作。
内容的提问来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

