데이터를 생성하는 동안 상태 저장 위젯에 데이터를 전달하는 권장 방법이 무엇인지 궁금합니다.
내가 본 두 가지 스타일은 다음과 같습니다.
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);
}
}