为什么 dart 泛型类不能根据构造函数确定其类型



我正在为我的FutureBuilder编写自己的MyFutureBuilders,每次都做同样的事情(除了处理我为其指定单独函数的快照数据(。

typedef MyFutureBuilderBuildFunction<T> = Widget Function(T snapshotData);
class MyFutureBuilder<T> extends StatefulWidget {
final MyFutureBuilderBuildFunction<T> builder;
final Future<T> future;
MyFutureBuilder({this.future, @required this.builder})
: assert(builder != null);
@override
State<StatefulWidget> createState() {
return MyFutureBuilderState(future: future, builder: builder);
}
}
class MyFutureBuilderState<T> extends State<MyFutureBuilder<T>> {
MyFutureBuilderBuildFunction<T> builder;
Future<T> future;
MyFutureBuilderState({this.future, @required this.builder})
: assert(builder != null);
@override
Widget build(BuildContext context) {
return FutureBuilder<T>(
future: future,
builder: (context, snapshot) {
if (snapshot.hasData) {
return builder(snapshot.data);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
return Center(child: CircularProgressIndicator());
},
);
}
}

当我实例化它时

Future<Article> _article;
MyFutureBuilder(
future: _article,
builder: (snapshotData) {

快照数据的类型是动态的,而不是文章。 不能从_article类型"未来"自动确定 T 类型吗?

当我单独将类型提供给MyFutureBuilder时(恕我直言,这是多余的(

Future<Article> _article;
MyFutureBuilder<Article>(
future: _article,
builder: (snapshotData) {

快照数据的类型当然是文章。

因为飞镖是类型安全的语言。

在第一个代码中,您应该在使用之前将返回的快照数据转换为所需的类型

Future<Article> _article;
MyFutureBuilder(
future: _article,
builder: (snapshotData) {
Article article = snapshotData as Article;
}
)

或者你可以给 Future Builder 一个类型参数,让它像在第二个代码中所做的那样自动转换它

最新更新