我想知道在创建有状态小部件时向它传递数据的推荐方式是什么.

我看到的两种风格是:

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中,而是存储在小部件中.

有没有这方面的最佳实践?

推荐答案

不要使用其构造函数将参数传递给State. 您应该只使用this.widget.myField访问参数.

编辑构造函数不仅需要大量的手工工作,而且不会带来任何东西.没有理由重复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")
    );
  }
}

Flutter相关问答推荐

类型flatter doctor get zsh:未找到命令:macO中flatter

Flutter:InteractiveViewer中可伸缩SVG背景上的定位小部件不对齐

我不能通过第5步了解Flutter 翼Firebase教程

从超级应用程序启动时,Flutter 小应用程序中未加载资源

就像Flutter 中的头文件一样?

有没有什么方法可以加快在Flutter 中加载Quill HTML编辑器的速度?

BoxConstraints强制使用无限宽度(列中的Listview)

使用ImageFilter模糊并剪裁同一renderObject中的元素

Wired Firebase错误-[CLOUD_FIRESTORE/UNAvailable]该服务当前不可用

Flutter Riverpod 没有捕获 List 的嵌套值变化

如何给按钮的边框半径?

无法从一个页面导航到下一个页面 (Flutter)

无法将Null类型的值分配给 const 构造函数中List类型的参数

使用 Play Integrity API 时,Firebase 电话身份验证问题缺少客户端标识符错误

有没有办法为文本中的下划线创建自定义样式?

statefulWidget 无法进行所需更改的问题

Future.wait() 中的 futures 可以顺序调用吗?

如何在 tabBar 中的选项卡之间制作垂直线?

使用 Chaquopy 插件后 Gradle Sync 无法正常工作

如何将图像网络装箱到具有边界半径的容器中