Personalizando nuestro BottomNavigation Bar a Cupertino iOS BottomBar
Una posibilidad que tenemos con Flutter es general Widgets idénticos a los de las plataformas nativas, en este caso para iOS con Cupertino.
En Flutter contamos con una sección especial para iOS, donde podemos generar botones, diálogos, pickers y hasta TabBar’s como es el caso de nuestro requerimiento.
Necesitamos que nuestro BottomBar luzca con una transparencia nativa de iOS
Para eso comenzaremos creando un nuevo archivo llamado platzi_trips_cupertino.dart
Crearemos una clase que herede de StatelessWidget de esta forma:
Ahora para disponer de la paquetería de Widgets Cupertino es necesario importar lo siguiente en el encabezado del documento debajo del paquete material.
La estructura será la misma utilizando Scaffold en la propiedad bottomNavigationBar colocaremos el Widget CupertinoTabScaffold y dentro en la propiedad tabBar pondremos los tabs con el Widget CupertinoTabBar, como se ve a continuación:
De esta forma ya estamos generando un TabBar con el estilo transparente que tiene iOS.
Ahora nos faltará manejar la navegación, eso lo haremos ahí mismo con la propiedad tabBuilder de la siguiente forma:
tabBuilder:(BuildContext context, int index){switch(index){case0:returnCupertinoTabView(builder:(BuildContext context)=>HomeTrips(),);break;case1:returnCupertinoTabView(builder:(BuildContext context)=>SearchTrips(),);break;case2:returnCupertinoTabView(builder:(BuildContext context)=>ProfileTrips(),);break;}},
The body might complete normally, causing ‘null’ to be returned, but the return type is a potentially non-nullable type. Try adding either a return or a throw statement at the end.
Necesitas agregarle al final un default y retornar tu vista por ejemplo Home:
Muchas gracias! Por más que buscaba documentación no entendía por completo, me ayudó mucho.
Mil gracias de vdd!
Si quieren poner que los botones con cupertino se vean morados activados y grises cuando no, en el widget CupertinoTabBar hay una propiedad llamada "activeColor" y ahi declaran el color "Colors.indigo" o "Colors.purple" en vez de en Icon()
buen aporte compañero.
Hola stevenbdf2019, puedes escribir el código de como lo implementas el activeColor.
Aqui les dejo el codigo listo para correr, ya corregi el atributo "title" que se encuentra obsoleta en las versiones mas mas nuevas, solo la cambie por "label".
Tengo una duda, si desarrollo para Android y para iOS, como consigo usar las particularidades de uno, al crear la app en ambas versiones.
Debes tener una Mac para ir probando tu app en iOS o alquilar una maquina virtual Mac OS en AWS.
Yo recomendaría quitar la propiedad Text() si no vamos a colocar nada ahí porque se los iconos se verán pegados al borde del CupertinoTabBar, pero si le ponemos texto se ve muy bonito 😄
Se ve genial!
En un video anterior @anncode indicó que el BottomNavigationBarItem le pedía como propiedad obligatoria texto, creo que por eso lo dejo.
Quedo Excelente!
Por que no funciona el SnackBar con la versión de cupertino?
X2
Asi me quedo :D, gracias a los compañeros por sus aportes, ayudan bastante
//cambia el color del menuItem seleccionadoactiveIcon:Icon(Icons.home,color:Color(0xCFF584CD1),)
Estimada AnnCode, recibe un cordial saludo, tengo una duda al implementar Cupertino BottomNavigation no funciona el snackBar, es un issue o estaré omitiendo algo del código?
Bueno parece que si es un issue. Y no solo eso si te fijas también no funciona bien el bottomNavigation ya que tiene los mismos colores en estado activo y no.
Pero encontre esto como implementar material design & cupertino respectivamente en su lenguaje nativo.
Espero que te sirva.
SnackBar no funciona con Cupertino?
Tambien note lo mismo, que apenas se activa la barra de cupertino deja de funcionar el SnackBar
Si se recicla la lista del código anterior
static final List<Widget> navigationWidget =[HomeView(),SearchView(),ProfileView()];
Se puede optimizar el tabBuilder
tabBuilder:(BuildContext context, int index){returnCupertinoTabView(builder:(BuildContext context)=> navigationWidget[index]);}
Listo!. Aunque a mi parecer noto un poco menos el efecto de transparencia en Android. De ahi en fuera lo unico que me dio unos problemas fue la clase donde se implemento Cuppertino ya que por alguna razón el editor te da una advertencia de que no se devuelve un valor, no impide el funcionamiento de la aplicación pero se soluciona agregando el comentario ignore: missing_return .
platzi_trips.dart
classPlatziTripsextendsStatefulWidget{ @override
State<StatefulWidget>createState(){// TODO: implement createStatereturn_PlatziTrips();}}class_PlatziTripsextendsState<PlatziTrips>{static int indexTap =0; final List<Widget> widgetsChildren =[HomeTrips(),SearchTrips(),ProfileTrips()];voidonTapTapped(int index){//Controlando el estado del widgetsetState((){ indexTap = index;//Recibe un indice y se lo asigna a indexTap});}
@override
Widgetbuild(BuildContext context){// TODO: implement buildreturnScaffold(body:PlatziTripsCupertino(),);}}
Te advierte que no devuelve valor, porque la funcion anonima debe devolver un widget, y con el switch ponen opcion 0,1 y 2, si en caso no se de alguno de esos valores, no devolvera un Widget, por eso sale la advertencia, lo que falta es agregar al switch un caso por defecto.
Por ejemplo:
switch(index){case0:returnCupertinoTabView(builder:(BuildContext context)=>HomeTrips(),);break;case1:returnCupertinoTabView(builder:(BuildContext context)=>SearchTrips(),);break;case2:returnCupertinoTabView(builder:(BuildContext context)=>ProfileTrips(),);break;default:returnCupertinoTabView(builder:(BuildContext context)=>HomeTrips(),);}```
}De esa manera se elimina la advertencia.
Creo que el tema de la advertencia es porque en los case no llevas separado el valor de la palabra reservada case (o al menos así se ve en el código que colocaste)
He seguido todos los paso para usar el tema de Cupertino pero noto que no toma la transparencia, pero si los estilo y colores de la barra inferior.
Hay forma de que manipulando la propiedad canvasColor se agregue ese mismo color entre blanco y transparente, sin necesidad de importar los packages de cupertino?
¿Eliminaron el repositorio?
parace que la profesora lo borró o movió accidentalmente, le pediré una url funcional!
Tengo una duda, el BottomNavigationBar de Cupertino siempre debe ser un Stateless Widget, es que encontré una diferencia en el comportamiento de ambos, en el bar de Cupertino( statless) cuando hago un cambio en la pantalla si cambio de Tab se mantiene el cambio, en cambio en el caso de el widget de Material(Stateful) si cambio de Tab los cambios que hice en la pantalla se reinician
Me pasa lo mismo. Incluso cuando uso el scroll los buttons de los lados se reinician, no así los del centro.
Lo solucionaste? a mi me pasa con el botón de favoritos, cuando muevo el ListView se reinicia
Si no les aparece un blur en su nav (que por defencto es blanco), agreguen el atributo
//Con blur de en colorbackgroundColor:Colors.white30//Con opacidad en tonobackgroundColor:Colors.white.withAlpha(50)