将数据传递给有状态的小部件 [英] Passing Data to a Stateful Widget

查看:53
本文介绍了将数据传递给有状态的小部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm wondering what the recommended way of passing data to a stateful widget, while creating it, is.

我看到的两种样式是:

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;
  }
}

此方法在<$ c $中都保留一个值c> ServerInfo 和 _ServerInfoState ,这似乎有点浪费。

This method keeps a value both in ServerInfo and _ServerInfoState, which seems a bit wasteful.

另一种方法是使用 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 中,而是存储在小部件中。

This seems a bit backwards as the state is no longer stored in _ServerInfoSate but instead in the widget.

是否有最佳做法?

推荐答案

不要使用其构造函数将参数传递给 State
您只能使用 this.widget.myField 访问它们。

Don't pass parameters to State using it's constructor. You should only access these using this.widget.myField.

不仅编辑构造函数还需要大量的手工工作;它什么也没带来。没有理由重复小部件的所有字段。

Not only editing the constructor requires a lot of manual work ; it doesn't bring anything. There's no reason to duplicate all the fields of Widget.

EDIT:

下面是一个示例:

class ServerIpText extends StatefulWidget {
  final String serverIP;

  const ServerIpText ({ Key key, this.serverIP }): super(key: key);

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

class _ServerIpTextState extends State<ServerIpText> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.serverIP);
  }
}

class AnotherClass extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: ServerIpText(serverIP: "127.0.0.1")
    );
  }
}

这篇关于将数据传递给有状态的小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆