onResume () y onPause () para widgets en Flutter

En este momento, un widget solo tiene initeState () que se activa la primera vez que se crea un widget y dispose (), que se dispara cuando se destruye el widget. ¿Hay algún método para detectar cuándo un widget vuelve al primer plano? y cuando un widget está a punto de irse al background porque otro widget simplemente estaba en primer plano? Es el equivalente de onResume y onPause activado para Android, y viewWillAppear y viewWillDisappear for ios

El caso más común en el que desea hacer esto es si tiene una animation en ejecución y no desea consumir resources en segundo plano. En ese caso, debe extender su State con TickerProviderStateMixin y usar su State como el argumento vsync para AnimationController . Flutter se encargará solo de llamar a los oyentes del controller de animation cuando su State sea ​​visible.

Si desea que los State que residen en su PageRoute se eliminen cuando el PageRoute está oculto por otro contenido, puede pasar un argumento de estado maintainState de false a su constructor de PageRoute . Si hace esto, su State se reiniciará (y sus hijos) cuando está oculto y tendrá que rebuildse en initState usando las properties pasadas como arguments del constructor a su widget . Puede usar una class de model o controller, o PageStorage , para mantener la información de progreso del usuario si no desea un restablecimiento completo.

Aquí hay una aplicación de ejemplo que muestra estos conceptos.

pantalla 1 pantalla 2 pantalla 3

 import 'package:flutter/material.dart'; void main() { runApp(new MaterialApp( onGenerateRoute: (RouteSettings settings) { if (settings.name == '/') { return new MaterialPageRoute<Null>( settings: settings, builder: (_) => new MyApp(), maintainState: false, ); } return null; } )); } class MyApp extends StatefulWidget { MyAppState createState() => new MyAppState(); } class MyAppState extends State<MyApp> with TickerProviderStateMixin { AnimationController _controller; @override void initState() { print("initState was called"); _controller = new AnimationController(vsync: this) ..repeat(min: 0.0, max: 1.0, period: const Duration(seconds: 1)) ..addListener(() { print('animation value ${_controller.value}'); }); super.initState(); } @override void dispose() { print("dispose was called"); _controller.dispose(); super.dispose(); } int _counter = 0; @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text('home screen') ), body: new Center( child: new RaisedButton( onPressed: () { setState(() { _counter++; }); }, child: new Text('Button pressed $_counter times'), ), ), floatingActionButton: new FloatingActionButton( child: new Icon(Icons.remove_networking_eye), onPressed: () { Navigator.push(context, new MaterialPageRoute( builder: (BuildContext context) { return new MySecondPage(counter: _counter); }, )); }, ), ); } } class MySecondPage extends StatelessWidget { MySecondPage({ this.counter }); final int counter; Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text('Certificate of achievement'), ), body: new Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ new Icon(Icons.developer_mode, size: 200.0), new Text( 'Congrats, you clicked $counter times.', style: Theme.of(context).textTheme.title, textAlign: TextAlign.center, ), new Text( 'All your progress has now been lost.', style: Theme.of(context).textTheme.subhead, textAlign: TextAlign.center, ), ], ), ); } } 
    Intereting Posts