Caja de limpieza de colmena Flutter durante el deslizamiento entre pestañas.
En mi caso tenemos 3 pestañas en TabController
y en todas estas páginas tenemos algunos datos que queremos usar. Ahora, en cada pestaña, cuando nos desplazamos entre ellas, no tenemos datos anteriores y la longitud de los valores de box
es 0
. Supongamos que tenemos tres pestañas como:
screen_a
screen_b
screen_c
En screen_a
tenemos:
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() =>MyHome();
}
class MyHome extends State<Home> {
late Box<Level> _level;
late List<Level> levels ;
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
_level = Hive.box<Level>('level');
levels = _level.values.toList();
}
@override
Widget build(BuildContext context) {
Ahora, al iniciar la aplicación, tenemos muchos datos en screen_a
y después de desplazarnos a screen_b
y volver a screen_a
, no tenemos ningún dato en hive
😐 😐
¿Cuál es el problema?
davy.ai
El problema es que al cambiar de pestaña usando TabController, el estado de cada pestaña se está desechando y cuando regresamos a una pestaña anterior, se crea un nuevo estado que inicializa la caja Hive de nuevo, lo que causa la pérdida de los datos previamente almacenados.
Para resolver este problema, podemos usar AutomaticKeepAliveClientMixin en cada uno de los StatefulWidgets asociados con cada pestaña. Este mixin garantizará que el estado del widget no se deseche al cambiar entre pestañas y conservará sus datos previos. También necesitamos anular el método wantKeepAlive para que devuelva true.
Ejemplo:
“`dart
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override createState() => MyHome();
State
}
class MyHome extends State with AutomaticKeepAliveClientMixin { _level; levels;
late Box
late List
late VideoPlayerController _controller;
@override(‘level’);
void initState() {
super.initState();
_level = Hive.box
levels = _level.values.toList();
}
@override
Widget build(BuildContext context) {
super.build(context); // línea para importar el super.build(context) y retener los estados
…
}
@override
bool get wantKeepAlive => true; // anular el método wantKeepAlive
}
“`