flutter 如何在StatefulWidget和State小部件中使用相同的泛型类型?

p5cysglq  于 2023-01-18  发布在  Flutter
关注(0)|答案(2)|浏览(158)

下面是一个使用FutureBuilder的通用StatefulWidget的代码模型。FutureBuilder示例化时,我收到以下错误:

type '(User) => Future<List<User>>' is not a subtype of type '(dynamic) => Future<List<dynamic>>'

我怀疑错误是编译器不知道TU是相同的,所以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();
        });
  }
}
ia2d9nvy

ia2d9nvy1#

对于那些寻找解决方案的人来说,你可以看到FutureBuilder是如何解决这个问题的,而不是为createState()方法编写_TestState<T>的返回类型,你可以编写State<TestWidget<T>>

State<TestWidget<T>> createState() => _TestState <T>();
oalqel3c

oalqel3c2#

我最终在StatefulWidget类中创建了第二个build()函数,它使用T泛型。它从State类中的build()调用。这样State类就不关心泛型了。我本来可以切换到具有托管状态的StatelessWidget,但我需要使用AutomaticKeepAliveClientMixin。所以我不得不坚持使用StatefulWidget。我的实际State类使用mixin,并且有更多的内容。

class TestWidget<T> extends StatefulWidget {
  final Future<List<T>> Function(T) myFunc = (_) => Future<List<T>>(null);

  Widget build(BuildContext context) {
    return FutureBuilder<List<T>>(
        future: myFunc(null),
        builder: (context, snapshot) {
          return Container();
        });
  }

  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<TestWidget> {
  @override
  Widget build(BuildContext context) {
    return widget.build(context);
  }
}

相关问题