dart - 为什么 Flutter State 对象需要 Widget?

标签 dart flutter

演示示例具有以下代码,这显然是 Flutter 应用程序的典型代码:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {...}
}

我很好,我想,MyHomePage覆盖 StatefulWidget createState方法。这有点尴尬,但到底是什么?甚至取决于 State子类。很好。

但是有了 State子类转身依赖MyHomePage ?!我无法用我相当丰富的智慧来解决这个问题。

所以也许我不清楚是什么State<MyHomePage>是/确实。比如说,Map<String, Object>意思很明确:将一个字符串与一个对象相关联。有人可以解释一下吗?如果您可以包括一些关于需要状态对象来扩展小部件的内容,我会很乐意阅读。

最佳答案

这是为了使小部件属性访问更容易。 当你这样做的时候

new MyStatefulWidget(foo: 42, bar: "string")

那么您很可能想从您的State 访问foo/bar

如果没有这样的语法,您必须键入自定义 State 构造函数并将所有 StatefulWidget 子类属性传递给 createState 内的 State 子类。基本上你会有:

class MyStatefulWidget extends StatefulWidget {
  final int foo;

  MyStatefulWidget({this.foo});

  @override
  MyStatefulWidgetState createState() => MyStatefulWidgetState(foo: foo);
}

class MyStatefulWidgetState extends State<MyStatefulWidget> {
  final int foo;

  MyStatefulWidgetState({this.foo});

  @override
  Widget build(BuildContext context) {
    return Container(

    );
  }
}

无聊。您必须将 StatefulWidget 子类的所有字段编写两次。


使用当前语法;你不必这样做。您可以使用 widget 字段直接访问 State 中当前实例化的小部件的所有属性。

class MyStatefulWidgetState extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    print(widget.foo);
    return Container();
  }
}

关于dart - 为什么 Flutter State 对象需要 Widget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51872999/

相关文章:

flutter : Maxlength not working on Textfield

dart - 在angular dart中,我是否可以根据多词条件的任何部分在字符串列表中找到索引

firebase - flutter + Firebase : how to send email verification

firebase - 将 firebase_ml_vision 添加到 flutter 引发错误 'Unknown type name ' FIRVisionCloudLabelDetector'

service - 如何在 Flutter 中创建服务以使应用始终在后台运行?

Flutter PageView 如何在滑动时制作更快的动画

dart - Dart Webdev服务器和PHP文件

flutter - 如何在 flutter 中从图库中获取图像或视频?

ios - 问题 : TMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs

flutter - 如何为 Flutter 创建主屏幕小部件