web-dev-qa-db-ja.com

ステートレスウィジェットは独自に破棄しますか?

ブロックパターンの実装をテストするためにPostUpdaterWidgetを利用するStatelessWidget拡張TextEditingControllersを作成しました。

final _usernameController = TextEditingController();
  final _contentController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
        TextField(
          controller: _usernameController,
          decoration: InputDecoration(hintText: "Post Username"),
        ),
        TextField(
          controller: _contentController,
          decoration: InputDecoration(hintText: "Post Content"),
        ),
        Container(
          height: 16,
        ),
        RaisedButton(
          child: Text("Update Post"),
          onPressed: () => _updatePost(context),
        )
      ],
    );
  }

  _updatePost(BuildContext context) {
    print("Processing Post Update");
    String username = _usernameController.text.trim();
    String content = _contentController.text.trim();

    Post post = new Post();
    post.id = id;
    post.username = username;
    post.content = content;

    id += 1;

    print("Dispatching Post Update");
    BlocProvider.of<PostBloc>(context).updatePost(post);
  }

多くの例で、コントローラーを破棄する必要があることを確認しました。ただし、overridedispose関数をStatelessWidgetするメソッドはありません。

使用するコントローラーを破棄する独自の破棄関数を作成し、このウィジェットを使用するユーザーのためにこのウィジェットの変数を作成して、破棄関数を呼び出すことができると考えました。

しかし、私は本当にそれをする必要があるのか​​、このStatelessWidgetが実際にそれ自体を破棄するのかを最初に知りたいです。

私は自分の考えを進めるべきですか?または、そのままにしておきます。これは、これらのコントローラーを単独で破棄する可能性があるため、メモリリークを心配する必要がないためです。

6
Rick

この質問 は、少なくともすぐにではなく、StatelessWidgetが破棄されたときにオブジェクトが破棄されないことを示しているようです。いずれの場合でも、TextEditingControllerを使用している場合(または変更可能な状態を維持している場合)は、StatefulWidgetを使用して、状態をStateクラスに保持する必要があります。 Stateクラスには、(質問で述べたように)使用できるdispose()メソッドがあります。

それ以外の場合、StatelessWidgetを使用すると、UIが再構築されるたびに状態が失われます。 StatefulWidgets状態はウィジェットではなくStateクラスにあるため、再構築後も状態を維持します。 この答え も参照してください。

1
Suragch