J'ai créé un PostUpdaterWidget
étendant StatelessWidget
qui utilise TextEditingControllers
pour tester l'implémentation de Bloc Pattern.
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);
}
J'ai vu dans de nombreux exemples que les contrôleurs doivent être éliminés. Cependant il n'y a pas de méthode pour override
une fonction dispose
dans un StatelessWidget
.
J'ai pensé à créer sa propre fonction dispose pour disposer des contrôleurs utilisés, et juste créer une variable de ce widget pour ceux qui utiliseront ce widget afin que je puisse appeler la fonction disposer.
Mais je veux d'abord savoir si j'ai vraiment besoin de le faire, ou ce StatelessWidget se débarrasse réellement de lui-même.
Dois-je poursuivre mon idée? Ou laissez-le tranquille, car il se peut qu'il dispose de ces contrôleurs de manière autonome, de sorte que je ne devrais pas me soucier des fuites de mémoire.
Cette question semble indiquer que les objets ne sont pas supprimés lorsque le StatelessWidget
est détruit, du moins pas immédiatement. Dans tous les cas, lorsque vous utilisez un TextEditingController
(ou maintenez un état mutable), vous devez utiliser un StatefulWidget
et conserver l'état dans la classe State
. La classe State
possède une méthode dispose()
que vous pouvez utiliser (comme vous l'avez mentionné dans votre question).
Sinon, si vous utilisez un StatelessWidget
, vous perdez votre état chaque fois que l'interface utilisateur est reconstruite. StatefulWidgets
conserve son état pendant les reconstructions car l'état est dans la classe State
, pas dans le widget. Voir aussi cette réponse .