ブロックパターンの実装をテストするために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);
}
多くの例で、コントローラーを破棄する必要があることを確認しました。ただし、override
にdispose
関数をStatelessWidget
するメソッドはありません。
使用するコントローラーを破棄する独自の破棄関数を作成し、このウィジェットを使用するユーザーのためにこのウィジェットの変数を作成して、破棄関数を呼び出すことができると考えました。
しかし、私は本当にそれをする必要があるのか、このStatelessWidgetが実際にそれ自体を破棄するのかを最初に知りたいです。
私は自分の考えを進めるべきですか?または、そのままにしておきます。これは、これらのコントローラーを単独で破棄する可能性があるため、メモリリークを心配する必要がないためです。
この質問 は、少なくともすぐにではなく、StatelessWidget
が破棄されたときにオブジェクトが破棄されないことを示しているようです。いずれの場合でも、TextEditingController
を使用している場合(または変更可能な状態を維持している場合)は、StatefulWidget
を使用して、状態をState
クラスに保持する必要があります。 State
クラスには、(質問で述べたように)使用できるdispose()
メソッドがあります。
それ以外の場合、StatelessWidget
を使用すると、UIが再構築されるたびに状態が失われます。 StatefulWidgets
状態はウィジェットではなくState
クラスにあるため、再構築後も状態を維持します。 この答え も参照してください。