web-dev-qa-db-fra.com

Les widgets apatrides disposent-ils d'eux-mêmes?

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.

6
Rick

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 .

1
Suragch