Surface/lib/widgets/navigation/app_drawer_navigation.dart

89 lines
3.0 KiB
Dart
Raw Normal View History

2024-11-13 16:08:09 +00:00
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
2024-12-08 09:14:31 +00:00
import 'package:package_info_plus/package_info_plus.dart';
2024-11-13 16:08:09 +00:00
import 'package:provider/provider.dart';
2024-11-13 16:20:59 +00:00
import 'package:responsive_framework/responsive_framework.dart';
2024-11-13 16:08:09 +00:00
import 'package:styled_widget/styled_widget.dart';
import 'package:surface/providers/navigation.dart';
class AppNavigationDrawer extends StatefulWidget {
final double? elevation;
2024-12-08 03:37:03 +00:00
const AppNavigationDrawer({super.key, this.elevation});
2024-11-13 16:08:09 +00:00
@override
State<AppNavigationDrawer> createState() => _AppNavigationDrawerState();
}
class _AppNavigationDrawerState extends State<AppNavigationDrawer> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
2024-12-08 03:37:03 +00:00
context.read<NavigationProvider>().autoDetectIndex(GoRouter.maybeOf(context));
2024-11-13 16:08:09 +00:00
});
}
@override
Widget build(BuildContext context) {
final nav = context.watch<NavigationProvider>();
2024-12-08 03:37:03 +00:00
final backgroundColor = ResponsiveBreakpoints.of(context).largerThan(TABLET) ? Colors.transparent : null;
2024-11-13 16:20:59 +00:00
2024-11-13 16:08:09 +00:00
return ListenableBuilder(
listenable: nav,
builder: (context, _) {
final destinations = [
...nav.destinations.where((ele) => ele.isPinned),
...nav.destinations.where((ele) => !ele.isPinned),
];
return NavigationDrawer(
elevation: widget.elevation,
2024-11-13 16:20:59 +00:00
backgroundColor: backgroundColor,
2024-11-13 16:08:09 +00:00
selectedIndex: nav.currentIndex,
children: [
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Solar Network').bold(),
2024-12-08 09:14:31 +00:00
FutureBuilder<String>(
future: PackageInfo.fromPlatform().then((value) => 'Stable ${value.version}+${value.buildNumber}'),
builder: (context, snapshot) {
return Text(!snapshot.hasData ? 'Stable 2.0' : snapshot.data!)
.fontSize(12)
.textColor(Theme.of(context).colorScheme.onSurface.withOpacity(0.5));
},
),
2024-11-13 16:08:09 +00:00
],
).padding(
horizontal: 32,
vertical: 12,
2024-11-13 16:08:09 +00:00
),
...destinations.where((ele) => ele.isPinned).map((ele) {
return NavigationDrawerDestination(
icon: ele.icon,
label: Text(ele.label).tr(),
);
}),
const Divider(),
...destinations.where((ele) => !ele.isPinned).map((ele) {
return NavigationDrawerDestination(
icon: ele.icon,
label: Text(ele.label).tr(),
);
}),
],
onDestinationSelected: (idx) {
nav.setIndex(idx);
GoRouter.of(context).goNamed(destinations[idx].screen);
Scaffold.of(context).closeDrawer();
},
);
},
);
}
}