106 lines
3.3 KiB
Dart

import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_remix/flutter_remix.dart';
import 'package:furman_now/src/routes/index.gr.dart';
import 'package:salomon_bottom_bar/salomon_bottom_bar.dart';
class MainLayout extends StatefulWidget {
const MainLayout({
Key? key,
}) : super(key: key);
@override
State<MainLayout> createState() => _MainLayoutState();
}
class _MainLayoutState extends State<MainLayout> {
DateTime oldTime = DateTime.now();
DateTime newTime = DateTime.now();
void showSnackBar() {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
behavior: SnackBarBehavior.floating,
duration: Duration(milliseconds: 600),
margin: EdgeInsets.only(bottom: 2, right: 2, left: 2),
content: Text('Tap back button again to exit'),
),
);
}
void hideSnackBar() {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
}
@override
Widget build(BuildContext context) {
return AutoTabsScaffold(
animationDuration: const Duration(milliseconds: 150),
routes: const [
HomePageRouter(children: [
HomeRoute(),
]),
MapRoute(),
EventsRoute(),
InfoPageRouter(children: [InfoRoute()]),
],
bottomNavigationBuilder: (_, tabsRouter) {
return WillPopScope(
onWillPop: () async {
if (tabsRouter.canNavigateBack) {
tabsRouter.navigateBack();
return false;
} else {
// if can't navigate back then we're probably trying to exit
newTime = DateTime.now();
int difference = newTime.difference(oldTime).inMilliseconds;
oldTime = newTime;
if (difference < 1000) {
hideSnackBar();
return true;
} else {
showSnackBar();
return false;
}
}
},
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 3, horizontal: 20),
child: SalomonBottomBar(
itemPadding:
const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
items: <SalomonBottomBarItem>[
SalomonBottomBarItem(
icon: const Icon(FlutterRemix.home_line),
title: const Text('Home'),
),
SalomonBottomBarItem(
icon: const Icon(FlutterRemix.map_2_line),
title: const Text('Map'),
),
SalomonBottomBarItem(
icon: const Icon(FlutterRemix.calendar_line),
title: const Text('Events'),
),
SalomonBottomBarItem(
icon: const Icon(FlutterRemix.information_line),
title: const Text('Info'),
),
],
currentIndex: tabsRouter.activeIndex,
selectedItemColor: Theme.of(context).primaryColor,
unselectedItemColor: Colors.grey[600],
onTap: (index) {
if (tabsRouter.activeIndex == index) {
// tabs
} else {
tabsRouter.setActiveIndex(index);
}
},
),
),
);
},
);
}
}