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.

Navegador emergente al usar persistent_bottom_nav_bar – Flutter

Actualmente estoy utilizando persistent_bottom_nav_bar: ^4.0.2 y rflutter_alert, pero el problema es que cuando llamo a Navigator.of(context).pop(); siempre obtengo este error:

FlutterError (Este widget ha sido desmontado, por lo que el State ya no tiene un contexto (y debe considerarse obsoleto). Considere cancelar cualquier trabajo activo durante "dispose" o usar el getter "mounted" para determinar si el State sigue activo.)

Esto sucede cuando uso persistent_bottom_nav_bar, he intentado usar bottomNavigationBar, que es una propiedad del widget Scaffold, y eso funciona bien, no hay problema con Navigator.of(context).pop();. ¿Hay alguna manera de hacer un pop del Navigator cuando se utiliza persistent_bottom_nav_bar?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas soluciones posibles para este problema:

    1. Utilizar el método incorporado popNavStack proporcionado por persistent_bottom_nav_bar. Este método se puede utilizar para deshacer la pila de navegación de la pestaña activa actualmente. Aquí hay un ejemplo:
      PersistentTabController _controller = PersistentTabController(initialIndex: 0);
      
      // ...
      
      PersistentTabView(
       controller: _controller,
       screens: _buildScreens(),
       items: _navBarsItems(),
       confineInSafeArea: true,
       backgroundColor: Colors.white,
       handleAndroidBackButtonPress: true,
       resizeToAvoidBottomInset: true,
       stateManagement: true,
       hideNavigationBarWhenKeyboardShows: true,
       popAllScreensOnTapOfSelectedTab: true,
       popActionScreens: PopActionScreensType.all,
       itemAnimationProperties: ItemAnimationProperties(
         duration: Duration(milliseconds: 200),
         curve: Curves.ease,
       ),
       screenTransitionAnimation: ScreenTransitionAnimation(
         animateTabTransition: true,
         curve: Curves.ease,
         duration: Duration(milliseconds: 200),
       ),
       navBarStyle: NavBarStyle.style13,
      )
      
      // ...
      
      // Ejemplo de uso para deshacer la pila de navegación de la pestaña actual
      _controller.popNavStack();
      
    2. Utilizar una GlobalKey para referenciar el widget PersistentTabView y llamar al método pop en su NavigatorState. Aquí hay un ejemplo:
      GlobalKey<persistenttabview> _persistentTabViewKey = GlobalKey<persistenttabview>();
      
      // ...
      
      PersistentTabView(
       key: _persistentTabViewKey,
       controller: _controller,
       screens: _buildScreens(),
       items: _navBarsItems(),
       confineInSafeArea: true,
       backgroundColor: Colors.white,
       handleAndroidBackButtonPress: true,
       resizeToAvoidBottomInset: true,
       stateManagement: true,
       hideNavigationBarWhenKeyboardShows: true,
       popAllScreensOnTapOfSelectedTab: true,
       popActionScreens: PopActionScreensType.all,
       itemAnimationProperties: ItemAnimationProperties(
         duration: Duration(milliseconds: 200),
         curve: Curves.ease,
       ),
       screenTransitionAnimation: ScreenTransitionAnimation(
         animateTabTransition: true,
         curve: Curves.ease,
         duration: Duration(milliseconds: 200),
       ),
       navBarStyle: NavBarStyle.style13,
      )
      
      // ...
      
      // Ejemplo de uso para deshacer la pila de navegación de la pestaña actual
      _persistentTabViewKey.currentState?.context?.navigator?.pop();
      
    3. Envolver el widget Navigator con un widget Builder para reconstruir el contexto cuando sea necesario. Aquí hay un ejemplo:

      “`
      PersistentTabView(
      controller: _controller,
      screens: _buildScreens(),
      items: _navBarsItems(),
      confineInSafeArea: true,
      backgroundColor: Colors.white,
      handleAndroidBackButtonPress: true,
      resizeToAvoidBottomInset: true,
      stateManagement: true,
      hideNavigationBarWhenKeyboardShows: true,
      popAllScreensOnTapOfSelectedTab: true,
      popActionScreens: PopActionScreensType.all,
      itemAnimationProperties: ItemAnimationProperties(
      duration: Duration(milliseconds: 200),
      curve: Curves.ease,
      ),
      screenTransitionAnimation: ScreenTransitionAnimation(
      animateTabTransition: true,
      curve: Curves.ease,
      duration: Duration(milliseconds: 200),
      ),
      navBarStyle: NavBarStyle.style13,
      tabBuilder: (context, index) {
      return Builder(builder: (BuildContext context) {
      return Navigator(
      onGenerateRoute: (routeSettings) {
      return MaterialPageRoute(
      builder: (context) => _buildScreens()[index],
      settings: routeSettings,
      );
      },
      observers: [
      HeroController(),
      ],
      );
      });
      },
      )

      // …

      // Ejemplo de uso para deshacer la pila de navegación de la pestaña actual
      Navigator.of(context).pop();
      “`

Comments are closed.