【发布时间】:2021-02-22 23:04:03
【问题描述】:
下面是使用 FutureBuilder 的通用 StatefulWidget 的代码模型。 FutureBuilder 实例化时出现以下错误:
type '(User) => Future<List<User>>' is not a subtype of type '(dynamic) => Future<List<dynamic>>'
我怀疑错误是编译器不知道T 和U 是相同的,所以U 被声明为动态而T 为User?我将如何更改此代码,以便将 StatefulWidget 中用于泛型的类型传递给 State 小部件?
Widget build(BuildContext context) => TestWidget<User>();
class TestWidget<T> extends StatefulWidget {
final Future<List<T>> Function(T) myFunc = (_) => Future<List<T>>(null);
@override
_TestState<T> createState() => _TestState<T>();
}
class _TestState<U> extends State<TestWidget> {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<U>>(
future: widget.myFunc(null),
builder: (context, snapshot) {
return Container();
});
}
}
【问题讨论】:
-
你可以很容易地测试出U和T是一样的。事实上,你甚至不需要改变create state的返回类型:
State createState() => _TestState<T>(); -
问题是你的 myFunc 声明。你可能需要创建一个命名的未来来做任何类型的工作。
-
我完全不知道这是如何编译的,因为您将 null 作为 Future 的计算传递
-
Future<List<T>> myFunc(_) async { return []; }将是一个工作声明 -
感谢@AlexeySubbotin。是的,未来没用,但确实编译并运行了。我更想展示我与仿制药的斗争。我的实际未来运行良好。