gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:05:08 25 4
gpt4 key购买 nike

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

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) {

snapshotData 的类型是dynamic 而不是Article。不能根据 _article 的类型自动确定类型 T,Future?

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

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

snapshotData的类型当然是Article。

最佳答案

因为 dart 是类型安全的语言。

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

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

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

关于generics - 为什么 Dart 泛型类不能根据构造函数确定其类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57397806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com