【问题标题】:Flutter State<WidgetName> createState() => WidgetNameState()Flutter State<WidgetName> createState() => WidgetNameState()
【发布时间】:2021-12-05 02:53:22
【问题描述】:

在 Flutter 中,当初始化一个新的 stateful widget 时,默认是这样初始化的:

class WidgetName extends StatefulWidget {
  const WidgetName({ Key? key }) : super(key: key);

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

我看到了另一种初始化 statefulwidget 的方法,@override 略有不同。

class WidgetName extends StatefulWidget {
  const WidgetName({ Key? key }) : super(key: key);

  @override
  State<WidgetName> createState() => WidgetNameState();
}

注意@override 方法中,WidgetNameState 变成了State&lt;WidgetName&gt;。 Flutter repo 中有一个解释:Link,但我无法理解它想说什么。

State&lt;WidgetName&gt; 究竟做了什么?它有什么好处吗? 我认为这是没有必要的,因为 WidgetNameState 在其类构造中已经从 State&lt;WidgetName&gt; 扩展而来。

class WidgetNameState extends State<WidgetName> {
  @override
  Widget build(BuildContext context) {

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    使用泛型确实可以让您定义一个必须使用的抽象 Widget 接口,而不必与该抽象 Widget 接口一起定义任何状态。

    让我们先看看使用具体类(WidgetNameState)。这是一个抽象的定义,如果我们这样做,我们必须定义状态。

    abstract class FooWidget extends StatefulWidget {
      const FooWidget({Key? key}) : super(key: key);
    
      @override
      _FooWidgetState createState();
    }
    
    abstract class _FooWidgetState extends State<FooWidget> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    现在要能够扩展它,您必须同时扩展小部件和状态。

    class ImplementedFooWidget extends FooWidget {
      const ImplementedFooWidget({Key? key}) : super(key: key);
    
      @override
      _ImplementedFooWidgetState createState() => _ImplementedFooWidgetState();
    }
    
    class _ImplementedFooWidgetState extends _FooWidgetState {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    现在让我们看看使用泛型 (State&lt;WidgetName&gt;)。如果我们使用泛型,我们可以定义和扩展小部件并拥有我们自己的自定义状态。

    abstract class BarWidget extends StatefulWidget {
      const BarWidget({Key? key, required this.someRequiredString})
          : super(key: key);
    
      final String someRequiredString;
    
      @override
      State<BarWidget> createState();
    }
    
    class ImplementedBarWidget extends BarWidget {
      const ImplementedBarWidget({Key? key, required String someRequiredString})
          : super(
              key: key,
              someRequiredString: someRequiredString,
            );
    
      @override
      _ImplementedBarWidgetState createState() => _ImplementedBarWidgetState();
    }
    
    class _ImplementedBarWidgetState extends State<ImplementedBarWidget> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    我希望一切都有意义。

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 2021-08-31
      • 2020-05-31
      • 2021-10-10
      • 2022-01-21
      • 2019-07-26
      • 2021-01-14
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多