[dart] 상태 저장 위젯에 데이터 전달

데이터를 생성하는 동안 상태 저장 위젯에 데이터를 전달하는 권장 방법이 무엇인지 궁금합니다.

내가 본 두 가지 스타일은 다음과 같습니다.

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 .

편집하다 :

예를 들면 다음과 같습니다.

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


답변

가장 좋은 방법 은 생성자를 사용하여 State 클래스에 매개 변수를 전달하지 않는 입니다. 를 사용하여 State 클래스에서 쉽게 액세스 할 수 있습니다 widget.myField.

예를 들어

class UserData extends StatefulWidget {
  final String clientName;
  final int clientID;
  const UserData(this.clientName,this.clientID);

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

class UserDataState extends State<UserData> {
  @override
  Widget build(BuildContext context) {
    // Here you direct access using widget
    return Text(widget.clientName);
  }
}

탐색 화면에서 데이터 전달 :

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => UserData("WonderClientName",132)));


답변

또 다른 대답은 @ 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);
  }
}


답변

초기 값 전달 (생성자에 아무것도 전달하지 않음)

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
  void initState(){
    super.initState();
    // you can use this.widget.foo here
  }

  @override
  Widget build(BuildContext context) {
    return Text(foo);
  }
}


답변