【问题标题】:What does the Object<type> syntax mean in Dart?Dart 中的 Object<type> 语法是什么意思?
【发布时间】:2018-12-17 04:26:02
【问题描述】:

在以下代码示例中,来自flutter docs

class RandomWords extends StatefulWidget {
  @override
  createState() => RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  @override
  Widget build(BuildContext context) {
    final wordPair = WordPair.random();
    return Text(wordPair.asPascalCase);
  }
}

State&lt;RandomWords&gt; 语法究竟是什么意思?

我知道您可以使用以下语法为集合中包含的对象(例如列表)指定类型 - List &lt;String&gt;

但我无法理解State&lt;RandomWords&gt; 背后的动机。

此外,您如何在RandomWords 声明中引用RandomWordsState 并在RandomWordsState 声明中引用RandomWords?这不应该导致循环引用错误吗?

我来自像 python 这样的动态类型语言,这对我来说有点奇怪,有人能指出我正确的地方吗?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    &lt;RandomWords&gt; 是传递给State 类的泛型类型参数。

    State 类看起来像

    abstract class State<T extends StatefulWidget> extends Diagnosticable {
    

    并且RandomWords 将被传递给T 类型参数,该类型参数具有T 必须是StatefulWidget 的子类的约束。

    State 还有一个字段和getter,其中使用了类型参数

      T get widget => _widget;
      T _widget;
    

    这会产生一个小部件类型的属性 它在其子类RandomWordsState 中提供了正确的自动补全和类型检查

    假设你有

    class RandomWords extends StatefulWidget {
      RandomWords({this.fixed});
    
      final WordPair fixed;
    
      @override
      createState() => RandomWordsState();
    }
    
    class RandomWordsState extends State<RandomWords> {
      @override
      Widget build(BuildContext context) {
        // vvvv here we can access `fixed` in a strongly typed manner
        final wordPair = widget.fixed ?? WordPair.random();
        return Text(wordPair.asPascalCase);
      }
    }
    

    另见https://www.dartlang.org/guides/language/language-tour#generics

    【讨论】:

    • 所以用简单的英语,人们会说“RandomWordsState 是 RandomWords 小部件的状态对象”,对吗?
    • 是的,但这并不能说明泛型语法;-) 我的印象是您的问题是关于泛型的。如果它是关于 RandomWordsRandomWordsState 的,那么是的,Flutter 有短命的小部件和长寿命的小部件状态,对于有状态的小部件,你有一个小部件和一个相关的状态 - 你问题中的 2 个类就是这样一对。
    • 我猜这两者兼而有之 :),谢谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多