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


113

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

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

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되지 않고 대신 위젯에 저장되므로 약간 거꾸로 보입니다 .

이에 대한 모범 사례가 있습니까?


3
생성자는 줄일 수있다ServerInfo(this._server);
귄터 Zöchbauer

이 이전 요청을받은 질문 : stackoverflow.com/questions/50428708/...
Blasanka


이 답변은이 답변 한 달 전에 추가되었습니다. stackoverflow.com/questions/50428708/…
Blasanka

답변:


231

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

23
추가 설명은 생성자를 통해 State 개체에 전달하는 모든 내용이 업데이트되지 않습니다.
Jonah Williams

4
그리고 여기에 나는 코멘트를 이해하지 못합니다. "생성자를 사용하여 State에 매개 변수를 전달하지 마십시오." 그렇다면 State에 매개 변수를 어떻게 전달합니까?
KhoPhi

6
@Rexford는 State이미 필드 Stateful를 사용하여의 모든 속성에 액세스 할 수 widget있습니다.
Rémi Rousselet

4
@ RémiRousselet foo를 사용하여 텍스트 필드를 미리 채우고 사용자가 편집 할 수 있도록하려면 어떻게해야합니까? 상태에 다른 foo 속성도 추가해야합니까?
사이드 사이 피

1
@ user6638204 상태에서 다른 foo 속성을 만들고 상태에서 재정 의하여 void initState()초기 값을 설정할 수 있습니다. 이 스레드 옵션 C를 예로 확인하십시오 .
Joseph Cheng

30

가장 좋은 방법 은 생성자를 사용하여 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)));

8

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

7
우리는 직접 foo는 같은 뭔가를 initState을 사용할 수 = widget.foo, 생성자에 더 전달이 필요하지 않습니다
Aqib

이것에 인수를 전달하는 방법?
Steev James

위젯은 @SteevJames MyStateful하나 개의 선택 명명 된 매개 변수 (속성) 당신은 호출하여이 위젯을 만들 수있다MyStateful(foo: "my string",)
키릴 Karmazin에를

@Aqib은 initState다음 시나리오에서 문제를 해결하지 않습니다. 예를 들어, 빈 매개 변수로 Statefull 위젯을 생성했고 데이터가로드되기를 기다리고 있습니다. 데이터가로드 될 때 새로운 데이터로 Statefull 위젯을 업데이트하려고하며이 경우 MyStatefull (newData)를 호출하면 호출 initState()되지 않습니다! 이 경우 didUpdateWidget(MyStatefull oldWidget)호출됩니다 그리고 당신은 인수에서 데이터를 비교하기 위해 필요 oldWidget.getData()widget.data하고 동일 하 경우 - 전화 setState()위젯을 재건.
Kirill Karmazin

1
@ kirill-karmazin Stateless 위젯 솔루션에 대해 자세히 설명해 주시겠습니까? 대신 무엇을 사용 하시겠습니까? Flutter 팀의 모범 사례입니까? 감사합니다
camillo777 2011

4

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

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);
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.