Flutter State<WidgetName> createState() => WidgetNameState()

Posted

技术标签:

【中文标题】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) 

【问题讨论】:

【参考方案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();
  

我希望一切都有意义。

【讨论】:

以上是关于Flutter State<WidgetName> createState() => WidgetNameState()的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Bad State 无元素

flutter通过GlobalKey在自定义Widget外部获取其state刷新页面

Flutter 实现局部刷新

Flutter之 State 生命周期

Flutter State 的生命周期

flutter学习-状态State管理