Navbar con bottoni tondi in Flutter
Una delle cose più belle di flutter è che esistono librerie per fare le cose più disparate.
Una interessante è circular_bottom_navigation, che in pratica ci da i bottoni tondi nella navbar.
In questo articolo vediamo un esempio su come usarla.
Prima di tutto aggiungiamo la libreria nel pubspec.yaml:
dependencies:
.....
circular_bottom_navigation: ^2.3.0
Qui sotto un esempio:
import 'package:circular_bottom_navigation/circular_bottom_navigation.dart';
import 'package:circular_bottom_navigation/tab_item.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Test',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Test'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int selectedPos = 0;
late CircularBottomNavigationController _navigationController;
double bottomNavBarHeight = 60;
List<TabItem> tabItems = List.of([
TabItem(
Icons.home,
"Home",
Colors.blue,
labelStyle: const TextStyle(
fontWeight: FontWeight.normal,
),
),
TabItem(
Icons.search,
"Cerca",
Colors.orange,
labelStyle: const TextStyle(
fontWeight: FontWeight.normal,
),
),
]);
@override
void initState() {
super.initState();
_navigationController = CircularBottomNavigationController(selectedPos);
}
@override
void dispose() {
super.dispose();
_navigationController.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.only(bottom: bottomNavBarHeight),
child: widgetBody(),
),
Align(
alignment: Alignment.bottomCenter,
child: widgetNav(),
),
],
),
);
}
Widget widgetBody() {
Color? selectedColor = tabItems[selectedPos].circleColor;
String slogan;
switch (selectedPos) {
case 0:
slogan = "HOME SCREEN!";
break;
case 1:
slogan = "CERCA!!";
break;
default:
slogan = "";
break;
}
return GestureDetector(
child: Container(
width: double.infinity,
height: double.infinity,
color: selectedColor,
child: Center(
child: Text(
slogan,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 20,
),
),
),
),
onTap: () {
if (_navigationController.value == tabItems.length - 1) {
_navigationController.value = 0;
} else {
_navigationController.value = _navigationController.value! + 1;
}
},
);
}
Widget widgetNav() {
return CircularBottomNavigation(
tabItems,
controller: _navigationController,
selectedPos: selectedPos,
barHeight: bottomNavBarHeight,
barBackgroundColor: Colors.white,
backgroundBoxShadow: const <BoxShadow>[
BoxShadow(color: Colors.black45, blurRadius: 10.0),
],
animationDuration: const Duration(milliseconds: 300),
selectedCallback: (int? selectedPos) {
setState(() {
this.selectedPos = selectedPos ?? 0;
});
},
);
}
}
Come vedete abbiamo anche creato due Widget appositi; io ho messo tutto insieme per semplicità.
Enjoy!
dart flutter pubspec circular_bottom_navigation
Commentami!