multilevel_navigator 2.0.0
multilevel_navigator: ^2.0.0 copied to clipboard
Мультиуровневая адаптивная навигация для Flutter поверх go_router: 4 уровня, автоподбор колонок под экран, resizable-колонки, модалки и сохранение состояния.
import 'package:multilevel_navigator/multilevel_navigator.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:multilevel_navigator_example/core/dependency_injection/dependency_injection.dart';
import 'package:multilevel_navigator_example/core/dependency_injection/dependency_data.dart';
import 'package:multilevel_navigator_example/core/navigation/nav_bar_visibility_cubit/nav_bar_visibility_cubit.dart';
import 'package:multilevel_navigator_example/core/navigation/navigation_panel.dart';
import 'package:multilevel_navigator_example/features/authentication/authentication.dart';
import 'package:multilevel_navigator_example/features/calls/calls.dart';
import 'package:multilevel_navigator_example/features/chats/chats.dart';
import 'package:multilevel_navigator_example/features/chats/widgets/modal_call.dart';
import 'package:multilevel_navigator_example/features/guest/guest.dart';
import 'package:multilevel_navigator_example/features/profile/profile.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Инициализируем зависимости
final dependencies = await DependencyInitializer.initializeDependencies();
/// Порядок важен
final features = [
/// Неавторизованные фичи
AuthenticationNavigationConfiguration(),
GuestNavigationConfiguration(),
/// Авторизованные фичи
ChatsNavigationConfiguration(),
CallsNavigationConfiguration(),
ProfileNavigationConfiguration(),
];
final multilevelNavigator = MultilevelNavigator(
features: features,
authenticationStateNotifier: AuthenticationStateNotifierImpl(
dependencies.currentUserRepository,
),
header: null,
overlay: null,
navigationPanelBuilder: (navigationShell) {
return NavigationPanel(navigationShell: navigationShell);
},
);
runApp(
MyApp(dependencies: dependencies, multilevelNavigator: multilevelNavigator),
);
}
class MyApp extends StatefulWidget {
const MyApp({
super.key,
required this.dependencies,
required this.multilevelNavigator,
});
final DependencyData dependencies;
final MultilevelNavigator multilevelNavigator;
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => NavBarVisibilityCubit(),
child: DependencyContainer(
currentUserRepository: widget.dependencies.currentUserRepository,
child: MultilevelNavigatorProvider(
multilevelNavigator: widget.multilevelNavigator,
child: MaterialApp.router(
title: 'Multilevel Navigator',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
routerConfig: widget.multilevelNavigator.router,
builder: (context, child) {
return Stack(
children: [
child ?? SizedBox.shrink(),
Positioned(
top: 80,
right: 10,
child: ElevatedButton(
onPressed: () {
NavigationUtils.openModal(
widget.multilevelNavigator.router,
ModalCall().id,
);
},
child: Text('test modal'),
),
),
],
);
},
),
),
),
);
}
}