将数据传递给有状态的小部件

问题描述 投票:42回答:2

我想知道在创建数据时,将数据传递给有状态小部件的推荐方法是什么。

我见过的两种风格是:

class ServerInfo extends StatefulWidget {

  Server _server;

  ServerInfo(Server server) {
    this._server = server;
  }

  @override
    State<StatefulWidget> createState() => new _ServerInfoState(_server);
}

class _ServerInfoState extends State<ServerInfo> {
  Server _server;

  _ServerInfoState(Server server) {
    this._server = server;
  }
}

这个方法在ServerInfo_ServerInfoState都保留了一个值,这看起来有点浪费。

另一种方法是使用widget._server

class ServerInfo extends StatefulWidget {

  Server _server;

  ServerInfo(Server server) {
    this._server = server;
  }

  @override
    State<StatefulWidget> createState() => new _ServerInfoState();
}

class _ServerInfoState extends State<ServerInfo> {
  @override
    Widget build(BuildContext context) {
      widget._server = "10"; // Do something we the server value
      return null;
    }
}

这似乎有点倒退,因为状态不再存储在_ServerInfoSate中,而是存储在小部件中。

这是最好的做法吗?

dart flutter
2个回答
118
投票

不要使用它的构造函数将参数传递给State。你应该只使用this.widget.myField访问它们。

编辑构造函数不仅需要大量的手工操作;它没带任何东西。没有理由复制Widget的所有字段。

编辑:

这是一个例子

class MyStateful extends StatefulWidget {
  final String foo;

  const MyStateful({Key key, this.foo}): super(key: key);

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

class _MyStatefulState extends State<MyStateful> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.foo);
  }
}

3
投票

另一个答案,建立在@RémiRousselet的anwser和@ user6638204的问题上,如果你想传递初始值并且仍然能够在以后状态更新它们:

class MyStateful extends StatefulWidget {
  final String foo;

  const MyStateful({Key key, this.foo}): super(key: key);

  @override
  _MyStatefulState createState() => _MyStatefulState(foo: this.foo);
}

class _MyStatefulState extends State<MyStateful> {
  String foo;

  _MyStatefulState({this.foo});

  @override
  Widget build(BuildContext context) {
    return Text(foo);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.