J'ai besoin de conserver l'état d'une application QML lorsqu'elle s'arrête et de la lire lors du chargement de l'application.
J'ai essayé d'utiliser Component.onCompleted
et Component.onDestruction
à l'intérieur du MainView
Page
.
Bien que cela fonctionne bien sur le bureau, sur l'appareil, il ne fonctionne pas: Component.onDestruction
n'est pas appelé lorsque vous fermez l'application.
Quelle est la bonne façon de gérer le cycle de vie de l'application?
Les composants Ubuntu incluent la capacité StateSaver . Cela permet aux propriétés QML d'être enregistrées à la sortie du programme et restaurées au redémarrage. Pour chaque élément avec les propriétés que vous souhaitez enregistrer, définissez le StateSaver.properties
propriété dans une liste séparée par des virgules des propriétés qui doivent être enregistrées.
Cependant, il existe deux énormes limites de StateSaver. Tout d'abord, l'état ne sera pas restauré si votre programme est lancé via le gestionnaire Uri. Deuxièmement, aucun état ne sera enregistré lorsque votre programme sera "fermé correctement". Je n'ai aucune idée de ce qui compte comme se fermant correctement, et donc je ne sais pas comment tester cela.
Alors que j'essayais cela, je suis tombé sur quelque chose d'étrange: si vous définissez une propriété StateSaver sur un élément, Component.onDestruction est appelé. Lorsque j'ai ajouté au Page
principal d'une application de test,
StateSaver.properties: "title"
StateSaver.enabled: false
mes gestionnaires de destruction ont commencé à être appelés, au moins sur les sorties normales. Vous pouvez peut-être combiner cela avec StateSaver pour vous assurer que l'état est enregistré sur les sorties normales et anormales. Je ne sais pas si vous pouvez compter sur ce comportement. Je soupçonne que cela pourrait être un accident de la mise en œuvre de StateSaver.
Une autre approche consisterait à sauver l'état chaque fois que quelque chose change. Cela garantit que vous n'avez rien à faire à la sortie; votre état est déjà en sécurité. Un problème avec cette approche est que les changements d'état sont souvent associés à des changements dans l'application elle-même, et le processus d'enregistrement pourrait induire une lenteur. J'ai rencontré ce genre de problème, donc j'ai retardé l'écriture de la base de données d'une seconde . Ceci est imparfait, car je perdrais l'état si le programme se bloque pendant cette seconde. Mais je sentais que le risque était suffisamment faible et le changement d'état suffisamment insignifiant pour que cela soit acceptable.