es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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
    State createState() => MyHome();
    }

    class MyHome extends State with AutomaticKeepAliveClientMixin {
    late Box _level;
    late List
    levels;
    late VideoPlayerController _controller;

    @override
    void initState() {
    super.initState();
    _level = Hive.box(‘level’);
    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
    }
    “`

Comments are closed.