【问题标题】:How to use same generic type in StatefulWidget and State widget?如何在 StatefulWidget 和 State 小部件中使用相同的泛型类型?
【发布时间】:2021-02-22 23:04:03
【问题描述】:

下面是使用 FutureBuilder 的通用 StatefulWidget 的代码模型。 FutureBuilder 实例化时出现以下错误:

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

我怀疑错误是编译器不知道TU 是相同的,所以U 被声明为动态而TUser?我将如何更改此代码,以便将 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() =&gt; _TestState&lt;T&gt;();
  • 问题是你的 myFunc 声明。你可能需要创建一个命名的未来来做任何类型的工作。
  • 我完全不知道这是如何编译的,因为您将 null 作为 Future 的计算传递
  • Future&lt;List&lt;T&gt;&gt; myFunc(_) async { return []; } 将是一个工作声明
  • 感谢@AlexeySubbotin。是的,未来没用,但确实编译并运行了。我更想展示我与仿制药的斗争。我的实际未来运行良好。

标签: flutter dart


【解决方案1】:

对于那些正在寻找解决方案的人,您可以查看FutureBuilder 如何解决此问题。不要在createState() 方法上编写返回类型_TestState&lt;T&gt;,而是编写State&lt;TestWidget&lt;T&gt;&gt;

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

【讨论】:

    【解决方案2】:

    我最终在使用 T 泛型的 StatefulWidget 类中有效地创建了第二个 build() 函数。它是从 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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多