下面是一个使用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();
});
}
}
2条答案
按热度按时间ia2d9nvy1#
对于那些寻找解决方案的人来说,你可以看到FutureBuilder是如何解决这个问题的,而不是为
createState()
方法编写_TestState<T>
的返回类型,你可以编写State<TestWidget<T>>
。oalqel3c2#
我最终在StatefulWidget类中创建了第二个
build()
函数,它使用T
泛型。它从State类中的build()
调用。这样State类就不关心泛型了。我本来可以切换到具有托管状态的StatelessWidget,但我需要使用AutomaticKeepAliveClientMixin。所以我不得不坚持使用StatefulWidget。我的实际State类使用mixin,并且有更多的内容。