209

ステートフル ウィジェットの作成中に、データをステートフル ウィジェットに渡す推奨される方法を知りたいです。

私が見た2つのスタイルは次のとおりです。

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ウィジェットではなくウィジェットに保存されるため、これは少し逆のようです。

これに対するベストプラクティスはありますか?

4

6 に答える 6

16

@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);
  }
}
于 2019-05-29T15:12:58.627 に答える
2

Flutter のステートフル ウィジェット API はちょっと扱いにくいです:オブジェクトbuild()に存在するメソッドでデータにアクセスするために Widget にデータを格納しStateます。より大きな状態管理オプション (プロバイダー、BLoC) を使用したくない場合は、flutter_hooks ( https:// pub.dev/packages/flutter_hooks ) - SatefullWidgets のより適切でクリーンな代替手段です。

class Counter extends HookWidget {
  final int _initialCount;

  Counter(this._initialCount = 0);
  
  @override
  Widget build(BuildContext context) {
    final counter = useState(_initialCount);

    return GestureDetector(
      // automatically triggers a rebuild of Counter widget
      onTap: () => counter.value++,
      child: Text(counter.value.toString()),
    );
  }
}
于 2021-03-02T20:15:53.533 に答える